TypeScript条件类型参数编译疑问:为什么函数g无法正常编译?
编译失败原因
TypeScript 对依赖未实例化泛型参数的条件类型,不会提前基于泛型约束做类型解析,这是官方有意设计的类型校验规则。
你在泛型函数g中定义的T extends string只是为T划定了类型上限,在g被实际调用、T的具体类型被确定之前,TS不会主动将T extends string ? boolean : Number这个条件类型简化推导为boolean,而是会将其判定为未确定的待定类型,因此不允许直接传入固定的boolean类型值true。
可行解决方案
- 类型断言兜底
确认业务逻辑不会出现类型问题的前提下,可以直接通过断言绕开校验:const g = <T extends string>(x: T) => f(x, true as Parameters<typeof f<T>>[1]); // 简单场景也可以直接用as any断言 const g = <T extends string>(x: T) => f(x, true as any); - 用函数重载替代条件类型参数
调整f的定义逻辑,用重载实现相同的类型限制,从根源避免这个问题:function f(x: string, y: boolean): boolean function f(x: unknown, y: Number): Number function f(x: unknown, y: unknown) { return y; } const g = <T extends string>(x: T) => f(x, true); // 编译正常
内容的提问来源于stack exchange,提问作者JustinM
相关产品推荐
相关产品推荐

