В JavaScript, если функция имеет 4 параметра, а мы используем только 3, ничего страшного — JavaScript просто игнорирует отсутствующий параметр и запускает функцию, как если бы она была undefined
.
В TypeScript все немного иначе. Если вы попытаетесь запустить функцию с другим количеством параметров, чем она имеет на самом деле, вы получите сообщение об ошибке. Например, рассмотрите это:
const myFunction = (a: string, b: string, c?: string) => { return a + " " + b + " " + c; } let runFunction = myFunction("Hello", "there");
let runFunction = myFunction("Hello", "there");
Приведенный выше код выдаст следующую ошибку:
Expected 3 arguments, but got 2.
TypeScript делает это, чтобы уменьшить количество ошибок, поскольку отсутствие параметра в вызываемой функции иногда может привести к ее поломке. Таким образом, нам нужно конкретно указать TypeScript, что один или несколько параметров, которые мы определили для функции, являются необязательными. Для этого мы используем ?
после параметра, чтобы обозначить, что это фактически необязательный параметр.
Например, если бы мы хотели сделать c
необязательным для нашей исходной функции, мы могли бы написать следующее — и не получить ошибку:
const myFunction = (a: string, b: string, c?: string) => {
return a + " " + b + " " + c;
}
let runFunction = myFunction("Hello", "there");
console.log(runFunction);
Теперь наша функция будет работать, как и ожидалось, однако вывод будет Hello there undefined
. Это может быть нежелательным для вас поведением, и именно поэтому в TypeScript есть эти элементы управления — они могут помочь предотвратить нежелательные результаты, требуя определенных параметров.
Однако в TypeScript за необязательным параметром не может следовать обязательный. Так, например, следующий код не будет работать:
const myFunction = (a: string, b?: string, c: string) => {
return a + " " + b + " " + c;
}
Это приведет к следующей ошибке:
A required parameter cannot follow an optional parameter.
Мы можем комбинировать эту возможность с использованием оператора typeof для создания кода, который имеет смысл. Например, если c
не является обязательным и не определено, мы можем игнорировать его, например:
const myFunction = (a: string, b: string, c?: string) => {
if(typeof c === undefined) {
return a + " " + b;
}
return a + " " + b + " " + c;
}
let runFunction = myFunction("Hello", "there");
console.log(runFunction);
Теперь вывод нашего кода будет Hello there
, но мы также можем запустить его с c
, чтобы получить другой вывод, например:
const myFunction = (a: string, b: string, c?: string) => {
if(typeof c === undefined) {
return a + " " + b;
}
return a + " " + b + " " + c;
}
let runFunction = myFunction("How", "are", "you?");
// Returns "How are you?"
console.log(runFunction);
Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter и LinkedIn. Посетите наш Community Discord и присоединитесь к нашему Коллективу талантов.