的类型,为了给这个问题有点背景的,我有一个要求,其母公司提供的回调子组件。 这是AngularJS的典型场景。
由于我使用的打字稿,我想在子组件强类型的回调。使用类或接口的方法
这里的初始状态,没有任何强烈的分型:
class ParentComponentController {
public parentMethod(param1: number, param2: string): boolean {
return param1 > 0 && param2.length > 2;
}
}
class ChildComponentController {
constructor(private parentMethod: Function) {}
public onCertainTrigger() {
this.parentMethod(10, 'something');
}
}
这是我怎么能实现强大的打字,但它似乎很凌乱:
declare type parentMethod = (param1: number, param2: string) => boolean;
interface ICommonApi {
parentMethod: parentMethod;
}
class ParentComponentController implements ICommonApi {
public parentMethod(param1: number, param2: string): boolean {
return param1 > 0 && param2.length > 2;
}
}
class ChildComponentController {
constructor(private parentMethod: parentMethod) { }
public onCertainTrigger() {
this.parentMethod(10, 'something');
}
}
理想情况下,我想象这是一-衬垫。是这样的可能吗?
class ParentComponentController {
public parentMethod(param1: number, param2: string): boolean {
return param1 > 0 && param2.length > 2;
}
}
class ChildComponentController {
// This results in an error
constructor(private parentMethod: ParentComponentController.parentMethod) {}
public onCertainTrigger() {
this.parentMethod(10, 'something');
}
}
正如答案中所解释的那样,第二个片段对于TS来说是惯用的,并且已经具有最不合理的代码量,而单行可能有启发性,但肯定不实际。在这里寻找一线球员基本上是代码高尔夫(顺便说一下,这是SO的offtopic)。 – estus
@estus你的回答对于TS来说可能是惯用的,但在JS中传递回调是很常见的。我想要一个强有力的键入回调的简短方法,而不必创建其他类型和接口;一条线就能实现这一点。在我看来,这不是“代码高尔夫”,因为我正在寻找TS的特定功能。 –
这是如何在TS中完成的。如果您需要键入的内容,这是一种类型,应该明确定义。做你想做的事情是一个黑客,除了它更短(这是代码高尔夫的定义),没有任何好处。如果它只是一次只使用一次,那么你应该在每个地方明确指定回调类型,'(n:number,s:string)=> boolean',我已经用解释更新了答案。其语义是,它不是'控制器方法类型',而是'恰好是与控制器方法类型相同的某种类型'。 – estus