[英]How to implement method overload in TypeScript on a plain object?
鉴于此代码:
type Foo = {
func(a:string):void;
func(b:number, a:string):void;
}
const f:Foo = {
func(b, a) {
// ???
}
}
我得到错误
类型 '(b: number, a: string) => void' 不可分配给类型 '{ (a: string): void; (b: 数字, a: 字符串): void; }'.ts(2322) index.ts(15, 3): 预期类型来自属性'func',它在此处声明为类型'Foo'
我看到使用类的答案,但如何在普通对象上实现?
编译器显然不高兴func(b, a)
需要第二个参数,而Foo
的func
方法不需要。 您可以通过在实现中a
可选来消除错误:
const f: Foo = {
func(b, a?) {
// ^-- optional
}
}
请注意,通常并不总能找到一种可以编译的方法。 重载函数语句允许它们的实现比任何调用签名更松散,但重载函数表达式不能那样工作:
function barFunc(a: string): number;
function barFunc(b: number, a: string): string;
function barFunc(b: string | number, a?: string) {
return typeof b === "string" ? b.length : a // okay
}
type Bar = {
func(a: string): number;
func(b: number, a: string): string;
}
const g: Bar = {
func(b, a?) { // error!
return typeof b === "string" ? b.length : a
}
}
在microsoft/TypeScript#47669有一个功能请求允许箭头函数以与函数语句相同的方式重载,但现在它不是语言的一部分。
所以如果你确实发现自己有一个不可能实现的重载箭头函数,你应该重构为一个函数语句:
const h: Bar = { func: barFunc }; // okay
或者使用类型断言来放松类型检查以使其能够编译:
const i: Bar = {
func(b, a?) {
return (typeof b === "string" ? b.length : a) as any // okay
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.