1. ホーム
  2. タイプスクリプト

[解決済み】引数として渡されたTypeScriptオブジェクトにデフォルト値を設定する

2022-03-31 21:46:10

質問

function sayName(params: {firstName: string; lastName?: string}) {
    params.lastName = params.lastName || 'smith';  // <<-- any better alternative to this?
    var name = params.firstName + params.lastName
    alert(name);
}

sayName({firstName: 'bob'});

こんな感じかな、と想像していました。

function sayName(params: {firstName: string; lastName: string = 'smith'}) {

明らかにこれらがプレーンな引数であれば、それを使うことができます。

function sayName(firstName: string, lastName = 'smith') {
    var name = firstName + lastName;
    alert(name);
}

sayName('bob');

そして、coffeescriptでは条件付き存在演算子にアクセスできるので、これができる。

param.lastName ?= 'smith'

javascriptにコンパイルされます。

if (param.lastName == null) {
    param.lastName = 'smith';
}

解決方法は?

実は、現在、簡単な方法があるようです。以下のコードは、TypeScript 1.5で動作します。

function sayName({ first, last = 'Smith' }: {first: string; last?: string }): void {
  const name = first + ' ' + last;
  console.log(name);
}

sayName({ first: 'Bob' });

そのコツは、まず引数オブジェクトからどのキーを選びたいかを大括弧で囲むことです。 key=value にはデフォルトを指定します。その後に : と型宣言を行います。

これは、あなたがやろうとしていたこととは少し違います。なぜなら、そのままの形で params オブジェクトの代わりに、デリファレンス変数を持っています。

関数に何かを渡すことをオプションにしたい場合は、関数内に ? を型内のすべてのキーに追加し、デフォルトの ={} を型宣言の後に追加します。

function sayName({first='Bob',last='Smith'}: {first?: string; last?: string}={}){
    var name = first + " " + last;
    alert(name);
}

sayName();