gpt4 book ai didi

typescript - 创建一个实现具有重载函数的接口(interface)的匿名对象

转载 作者:搜寻专家 更新时间:2023-10-30 21:50:47 25 4
gpt4 key购买 nike

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

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

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

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

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

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

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

我知道我可以用一个类来做到这一点,但我宁愿不创建一个完整的类,如果有某种方法可以在没有类的情况下做到这一点。

最佳答案

弄清楚了 - 如果函数具有重载签名,则将基函数键入 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 的最后一段:

Note that the function pickCard(x): any piece is not part of the overload list, so it only has two overloads: one that takes an object and one that takes a number. Calling pickCard with any other parameter types would cause an error.

关于typescript - 创建一个实现具有重载函数的接口(interface)的匿名对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44980530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com