我有一个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>'.
我知道我可以用一个班级来做这个,但是如果有一些方法可以在没有班级的情况下做这个,我宁愿不创建一个完整的班级。
答案 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 Handbook's functions section的最后一段:
请注意,
function pickCard(x): any
部分不是重载列表的一部分,因此它只有两个重载:一个接受一个对象,另一个接受一个数字。使用任何其他参数类型调用pickCard
会导致错误。