typescript - Typescript中函数声明的区别

标签 typescript typescript-typings

假设我们有这样的代码:

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 .

当我调用callercallerB时,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;

Playground Link

关于typescript - Typescript中函数声明的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65073720/

相关文章:

node.js - 如何设置服务器端 Node.js 项目以使用 Typescript 和 Webpack

javascript - Ionic 2 项目中的 "Property _ does not exist on _ type"D3.js typescript 错误

javascript - 如何将字符串转换为 Typescript 中的枚举

reactjs - 类型 'ref' 上不存在属性 'IntrinsicAttributes'

angular - Typescript 如何从嵌套对象 Getter 返回类函数引用

typescript - 从构造函数类型获取实例类型

javascript - 单击使用 map 框后如何使标记默认

node.js - Angular 2/4 Typescript 数组内容未更新

typescript - 我如何在 typescript 上制作多类型属性接口(interface)

typescript - 如何从 typescript 使用 tensorflow js (tfjs)?