2017-12-06 8 views
2

2番目のパラメータをオプションにするには、以下の関数をどのように変更しますか?オプションの分解関数パラメータ

活字体:

function getName(name: string, { 
    lastName 
    }: { 
    lastName: string 
    }) { 
    // ... 
} 

getName('John'); // error 

アップデート:私がこれまでに見つけた解決策は、関数本体の中に解体を取ることです

:しかし

function getName(name: string, options: { 
    lastName: string 
    } = {} as any) { 
    const { lastName } = options; 
    // ... 
} 

getName('John'); // OK 

、私はまだこのコンテキストでそれを動作させる方法を見つけることができません:

関数に解体を移動
const getName = Bluebird.coroutine(function* co(name: string, 
    { 
    lastName 
    }: { 
    lastName: string 
    }) { 
    // ... 
}); 

getName('John'); // error 


/* -------- DECLARATIONS -------- */ 

declare namespace Bluebird { 
    interface CoroutineOptions { 
     yieldHandler(value: any): any; 
    } 
} 

declare class Bluebird<R> { 
    static coroutine<T, A1, A2>(
     generatorFunction: (a1: A1, a2: A2) => IterableIterator<any>, 
     options?: Bluebird.CoroutineOptions 
    ): (a1: A1, a2: A2) => Bluebird<T>; 
} 

体はまだエラーを与える:

const getName = Bluebird.coroutine(function* co(name: string, options: { 
    lastName: string 
    } = {} as any) { 
    // ... 
}); 

getName('John'); // error: Expected 2 arguments but got 1. 
+0

更新を確認する構文は正しいですか?私はこの例で使用されているように 'function * 'や' coroutine'を認識していません。これは明確に表示できますか? – cnishina

答えて

2

options = {}は動作するはず?

function getName(name: string, options = {}) {}

3

あなたはオプションのオブジェクトを定義するときに、オプションとしてlastNameプロパティのためのインタフェースを定義する必要があります。 optionsが定義されていない場合、デフォルトのオブジェクトは空のオブジェクト{}です。上記を実行する

function foo(required: string, options: { lastName?: string } = {}) { 
    console.log(required); 
    if (options.lastName) { 
     console.log(options.lastName); 
    } 
} 

foo('foo1') 
foo('foo2', {}) 
foo('foo3', {lastName: 'bar'}) 

、コンソール出力は次のようになります。

foo1 
foo2 
foo3 
bar 

自分でそれを試してみることTypeScript playground linkを参照してください。

+0

脱構築を取り上げるのは、質問を更新したときのように機能します。 Bluebirdコルーチンを使用するときには私が理解できない場合があります。更新された質問をご覧ください。 – orad

関連する問題