TypeScript:前置泛型存在时字符串字面量泛型无法收窄?求解决方案
问题原因
当显式指定部分泛型参数(如goo<{}>中的{})时,TypeScript会对未指定的泛型参数直接使用其默认值(此处K的默认值为string),不再根据传入的实参进行类型推断。这是TypeScript泛型推断的既定行为,并非无法实现需求,只需调整写法即可。
解决办法1:使用泛型占位符(TypeScript 4.7+)
将需要自动推断的泛型参数前置,显式指定的参数后置,并用_作为占位符让TypeScript自动推断前置参数:
const goo = <K extends string = string, T extends Record<string, any>>(arg: K): T => ({} as T) goo<_, {}>('my string'); // const goo: <"my string", {}>(arg: "my string") => {}
解决办法2:柯里化拆分泛型参数
通过柯里化将泛型参数拆分为两个函数,先固定需要显式指定的T类型,再让第二个函数根据传入的参数推断K的字面量类型:
const goo = <T extends Record<string, any>>() => <K extends string = string>(arg: K): T => ({} as T) goo<{}>()('my string'); // const goo: <{}>() => <"my string">(arg: "my string") => {}
内容的提问来源于stack exchange,提问作者Anton Podolsky
相关产品推荐
相关产品推荐

