В 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 и присоединитесь к нашему Коллективу талантов.