2

「送信」という1つの関数があり、2つの許可されたシグネチャでオーバーロードされるTypeScriptインターフェイスがあります。オーバーロードされた関数を持つインターフェイスを実装する匿名オブジェクトの作成

export interface ConnectionContext { 
    send(data: ConnectionData): void; 
    send(data: ConnectionData, timeout: number): Promise<ConnectionData>; 
} 

私はこのインタフェースを実装する匿名のオブジェクトを作成しようとしています:

Error:(58, 15) TS2322:Type '{ send: (data: ConnectionData, timeout?: number | undefined) => void | Promise<ConnectionData>; }' is not assignable to type 'ConnectionContext'.

Types of property 'send' are incompatible.

const context: ConnectionContext = { 
    send: (data: ConnectionData, timeout?: number): void | Promise<ConnectionData> => { 
     // 
    } 
}; 

しかし、活字体2.4.1は、次のエラーが発生して

Type '(data: ConnectionData, timeout?: number | undefined) => void | Promise<ConnectionData>' is not assignable to type '{ (data: ConnectionData): void; (data: ConnectionData, timeout: number): Promise<ConnectionData>; }'.

Type 'void | Promise<ConnectionData>' is not assignable to type 'Promise<ConnectionData>'.

Type 'void' is not assignable to type 'Promise<ConnectionData>'.

私はクラスでこれを行うことができます知っているが、1せずにこれを行うにはいくつかの方法がある場合、私はむしろ、全体のクラスを作成していないと思います。

+0

私はこれに似た問題を抱えており、これに対する一般的な答えも興味があります。 – bcherny

答えて

1

- 関数にオーバーロードシグネチャがある場合は、基底関数をanyと入力します。これは直観に反しますが、現在TypeScriptがどのように動作しているかです。

固定コード:

export interface ConnectionContext { 
    send(data: ConnectionData): void; 
    send(data: ConnectionData, timeout: number): Promise<ConnectionData>; 
} 

const context: ConnectionContext = { 
    send: (data: ConnectionData, timeout?: number): any => {} 
}; 

let a = context.send(1)  // void 
let b = context.send(1, 2) // Promise<ConnectionData> 

TypeScript playground link

TypeScript Handbook's functions sectionから非常に最後の段落を参照してください:function pickCard(x): any作品が過負荷リストの一部ではないことを

注意を、それだけオブジェクトを取るものと番号を取るものの2つのオーバーロードがあります。他のパラメータタイプとpickCardを呼び出すとエラーが発生します。

関連する問題