能否从TypeScript函数体推断函数参数的键集合类型?
能否基于函数体推断TypeScript函数的参数类型?
结论:不行
原因如下:
- TypeScript的类型推断是正向静态推导,仅基于代码的静态声明结构(比如参数注解、显式类型、调用传入的参数),不会逆向扫描函数体代码来反推参数的类型约束。对于未标注类型的参数
bar,TypeScript只会默认推断为any,不会识别函数体里用到的bar.baz和bar.quux,进而给bar加上包含对应键的类型。 - TypeScript的核心设计目标是可靠的静态类型检查,逆向从函数体推导参数类型会引入大量不确定性:比如函数体存在条件分支时,不同分支可能用到不同属性;如果有动态属性访问(如
bar[动态变量]),根本无法确定具体键名。这种推导会让类型系统复杂度飙升,结果不可预测,违背静态类型的设计初衷。 - 你定义的
MyFn<Keys>泛型类型,其泛型参数只能通过显式注解或调用时的参数传入来确定,无法从函数体内部的属性使用情况自动推断出Keys的具体值。比如你必须显式写const foo: MyFn<"baz" | "quux"> = (bar) => bar.baz + bar.quux,才能让bar获得对应的类型约束。
内容的提问来源于stack exchange,提问作者Steven Kalt
相关产品推荐
相关产品推荐

