Typescript 在函数类型的成员变量中具有多个函数签名
为什么“handler”函数变量不可能有多个签名 以这个理想但无效的代码段为例:Typescript 在函数类型的成员变量中具有多个函数签名,typescript,typescript-typings,typescript-class,Typescript,Typescript Typings,Typescript Class,为什么“handler”函数变量不可能有多个签名 以这个理想但无效的代码段为例: class MyEntityService { private handleThing: (a: undefined) => undefined; private handleThing: <T extends object>(a: T) => T; private handleThing: <T extends object>(a: T | undef
class MyEntityService {
private handleThing: (a: undefined) => undefined;
private handleThing: <T extends object>(a: T) => T;
private handleThing: <T extends object>(a: T | undefined) => object | T {
if (!a) return undefined;
// Various calls to other private methods here
return a;
}
}
只有把手:(a:T |未定义)=>对象|未定义
并不理想:
async
函数,并删除处理函数变量,但这将违背我的团队为我遇到这个难题的项目建立的既定代码约定
因此,我要求:
要使第一个代码段正常工作,需要将
handleThing
视为一个初始化属性,而不是一个方法;这意味着您给它一个类型注释和一个值。注意,重载函数的类型可以表示为每个签名的类型(例如,((x:string)=>number)&((x:number)=>string)
),或者表示为具有多个签名的单个对象类型(例如,{(x:string):number;(x:number):string;}
)。像这样:
class MyEntityService {
private handleThing: {
(a: undefined): undefined;
<T extends object>(a: T): T;
} = <T extends object>(a: T | undefined) => {
if (!a) return undefined;
// Various calls to other private methods here
return a;
}
}
因为(x:undefined)=>如果让T
在对象
和未定义
上都有范围,则未定义的
应该与该签名匹配
无论如何,希望这有帮助;祝你好运 你不使用
(a:t)=>t
有什么原因吗?也许我输入函数的方式不对,但我记得在承诺链和接口继承方面有问题(这是我的预期用途,例如promise.then(this.handler1)。然后(this.handler2)。然后(…)
)。我记得尝试过你的第二个建议,但是我在使用带有承诺链的变量时偶然发现了一些语法错误,例如promise.then(this.handleThing)
。不知道发生了什么;也许我做错了什么,但我可以再试一次。另外,不知道3.4引入了这样的支持,可能值得更新,即使不考虑这个具体问题。第一个建议是可靠的;我已经试过类似的方法了,但不是完全按照你的建议。无论如何,这是一个巨大的帮助,非常感谢!
class MyEntityService {
private handleThing: {
(a: undefined): undefined;
<T extends object>(a: T): T;
} = <T extends object>(a: T | undefined) => {
if (!a) return undefined;
// Various calls to other private methods here
return a;
}
}
class MyEntityService {
private handleThing = <T extends object | undefined>(a: T): T => {
if (!a) return undefined as T; // have to assert here
// Various calls to other private methods here
return a;
}
}