【发布时间】:2021-09-03 22:08:38
【问题描述】:
我正在将一些代码转换为 TS,并希望实现这个接口
let handler = new Handler()
.on("data", (content) => /*something*/)
.on("finished", (content) => /*something else*/);
但我遇到了区分回调类型的问题。 将回调放入有区别的联合中不起作用,因为它们具有不同的签名。 这是我到目前为止所得到的:
interface Content {
x: string,
y: string,
}
type EventType = "data" | "error" | "finished";
type DataCallback = (content: string) => void;
type ErrorCallback = (content: string) => void;
type FinishedCallback = (content: Content) => void;
type EventCallback = DataCallback | ErrorCallback | FinishedCallback;
class Handler {
ondata: DataCallback;
onerror: ErrorCallback;
onfinished: FinishedCallback;
on(event: EventType, callback: EventCallback) {
if (event === "data") this.ondata = callback;
else if (event === "error") this.onerror = callback;
else if (event === "finished") this.onfinished = callback;
else console.error(`Unhandled event: ${event}`);
return this;
}
}
但这会产生以下错误:
TS2322: Type 'EventCallback' is not assignable to type 'DataCallback'.
Type 'FinishedCallback' is not assignable to type 'DataCallback'.
Types of parameters 'content' and 'content' are incompatible.
Type 'string' is not assignable to type 'Content'.
这完全有道理。
这个接口在 Typescript 中是不可能实现的吗?
一种选择是将界面更改为
onData(callback: DataCallback) { this.ondata = callback; }
等等,但我希望我可以保持相同的界面。
【问题讨论】:
标签: typescript