JavaScript-программисты обычно используют их как взаимозаменяемые, хотя между ними и есть тонкое семантическое различие, достойное упоминания: undefined означает, что нечто еще не было определено, а null показывает отсутствие значения (как если бы вы пытались вычислить значение, но сталкивались при этом с ошибкой). Это всего лишь условности, и TypeScript вас не принуждает к их соблюдению, однако будет полезным понимать разницу.
Как и JavaScript, TypeScript позволяет снабдить опциональные параметры значениями по умолчанию. Семантически это схоже с назначением параметра опциональным, поскольку вызывающий элемент не обязан передавать такой параметр функции (разница в том, что параметр по умолчанию можно не ставить в конец списка в отличие от опционального).
Например, можно переписать log так:
function log(message: string, userId = 'Not signed in') {
Как и для типов object и кортежей, можно использовать ? для обозначения параметра в качестве опционального. При объявлении параметров функции необходимые параметры должны идти перед опциональными:
function log(message: string, userId?: string) {
let time = new Date().toLocaleTimeString()
console.log(time, message, userId || 'Not signed in')
}
log('Page loaded') // Логирует "12:38:31 PM
// Page loaded Not signed in"
log('User signed in', 'da763be') // Логирует "12:38:31 PM
Почему же его стоит избегать? Вспомните, чем является тип? Правильно. Это набор значений и доступных для них действий. any же представляет собой набор всех возможных значений, и вы можете делать с ним все что угодно: прибавлять к нему, умножать на него, вызывать для него .pizza() и т.д.