假设我们有这样的代码:
interface Vehicle {
bicycle(): string;
car(wheel: number): void;
bus(passanger: number): {
name: string;
age: number;
}[];
}
type Mapper<K extends keyof Vehicle> = (funcName: K, callback: Vehicle[K]) => void;
interface MapperB {
<K extends keyof Vehicle>(name: K, callback: Vehicle[K]): any;
}
declare const caller: Mapper<keyof Vehicle>;
declare const callerB: MapperB
或者 typescript Playground here .
当我调用caller
和callerB
时,caller
无法根据callback
类型推断第一个论点。事实上,我发现没有办法存档。但 callerB
一切都做得很好。
caller("bicycle", () => {
})// can't give any intellisense
callerB('bus', (passanger) => {
return [{
name: 'Jack',
age: 11
}]
})// will give perfect hints according to first argument.
所以我想知道这两个声明之间有什么区别,它似乎不是一个错误。
最佳答案
一个是泛型类型,恰好是一个函数 (Mapper
),另一个是泛型函数 (MapperB
)。
泛型类型在声明caller
时指定了其类型参数,因此当您调用caller
时不会再发生推理。 K
已经确定,K
将成为'bicycle' | 的联合体。 '汽车' | '总线'
。因此callback
将被输入为Vehicle['bicycle' | '汽车' | 'bus']
它将是 Vehicle
中所有函数签名的联合,这对于您想要的可能过于宽松。
泛型函数在调用函数时指定(或推断)其类型参数。所以此时根据参数的类型,确定K
就是bus
,这样就可以更准确地推断出回调参数。
您可以使用类型别名声明泛型函数,但泛型类型参数列表必须位于函数上而不是类型上:
type Mapper = <K extends keyof Vehicle>(funcName: K, callback: Vehicle[K]) => void;
关于typescript - Typescript中函数声明的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65073720/