2017-11-26 6 views
0

を欠い私は次のコードを持って表現呼び出すことはできません:警告 - タイプのコール署名

export interface IStartCreate1 { 
    (desc?: string, opts?: IDescribeOpts, arr?: Array<string | IDescribeOpts | TCreateHook>, fn?: TCreateHook): void; 
    tooLate?: boolean; 
} 

export interface IStartCreate2 { 
    (opts?: IDescribeOpts, arr?: Array<string | IDescribeOpts | TCreateHook>, fn?: TCreateHook): void; 
    tooLate?: boolean; 
} 

export interface IStartCreate3 { 
    (arr?: Array<string | IDescribeOpts | TCreateHook>, fn?: TCreateHook): void; 
    tooLate?: boolean; 
} 

export interface IStartCreate4 { 
    (fn: TCreateHook): void; 
    tooLate?: boolean; 
} 

export type IStartCreate = IStartCreate1 | IStartCreate2 | IStartCreate3 | IStartCreate4; 

をそれから私はそうのようなオブジェクトがあります。

const v = { 
    create: function(){} as IStartCreate 
} 

v.create([]); 

を私は、このエラーメッセージが表示されます

タイプにコールシグネチャがない式を呼び出すことはできません。

私は空の配列が、私は同様のエラーメッセージを他のSOの質問を見ていると私はこの1つを把握することはできませんIStartCreate3

に一致すると思うだろう!

+0

これは、問題を記述するようだ:https://github.com/Microsoft/TypeScript//7294 –

答えて

1

達成しようとしていることを理解することは役に立ちます。一般に、これは問題を引き起こす可能性が非常に複雑な型宣言のようです。

IStartCreateのあなたの宣言は、それがいずれかIStartCreate1またはIStartCreate2または3であると述べているが、我々はどのわかりません。したがって、すべてIStartCreate1,IStartCreate2およびIStartCreate3(つまり、のみ)に存在するメンバー/シグネチャにのみアクセスできます。探しているメソッドのシグネチャがすべてではありません。

実際にv.createIStartCreate3を実装していることが確かであれば、(v.create as IStartCreate3)([])を実行できますが、異なるタイプのものが見つかると実行時エラーが発生します。

一般に、関数のオーバーロードはTypeScriptでは特にうまく機能しません。通常、これを避けるようにします。ユニオンタイプは、コールサインを持つことができないように2017のよう

+0

この場合、それはユーザーの便宜のためであり、型の安全性に関するものではないことに同意しますが、一般的にはオーバーロードしないほうが良いということに同意します。私は、組合の型が "呼び出し可能"ではないという説明を加えました。 –

1

は、になります。

https://github.com/Microsoft/TypeScript/issues/7294

はかなりラメようです。

だから私は、労働組合の種類を廃止しなければならなかったし、それを別の方法を行うには、次のようになります。

export type TArray = Array<string | IDescribeOpts | TCreateHook>; 

export interface IStartCreate { 
    (desc: string | IDescribeOpts | TCreateHook | TArray, 
    opts?: IDescribeOpts | TCreateHook | TArray, 
    arr?: TArray | TCreateHook, 
    ): void; 
    tooLate?: boolean; 
} 
関連する問題