创建一个实现具有重载函数的接口的匿名对象

时间:2017-07-07 22:28:04

标签: typescript interface anonymous-types overloading

我有一个TypeScript接口,它有一个名为“send”的函数,该函数重载了两个允许的签名。

_rex = re.compile("\d+")
if _rex.fullmatch(s):
    doStuff()

我正在尝试创建一个实现此接口的匿名对象:

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

但是,TypeScript 2.4.1产生以下错误:

const context: ConnectionContext = { send: (data: ConnectionData, timeout?: number): void | 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.

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>'.

我知道我可以用一个班级来做这个,但是如果有一些方法可以在没有班级的情况下做这个,我宁愿不创建一个完整的班级。

1 个答案:

答案 0 :(得分: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部分不是重载列表的一部分,因此它只有两个重载:一个接受一个对象,另一个接受一个数字。使用任何其他参数类型调用pickCard会导致错误。