TypeScript泛型函数参数类型识别异常:布尔类型被收窄为具体值
解决TypeScript中函数参数布尔类型被推导为字面量而非boolean的问题
问题场景
你定义了如下TypeScript类型和函数:
// 描述类型 type StorageData = { prop1: boolean; prop2: number; prop3: string; prop4: "static" | "dynamic"; }; type ParamsToGet = Partial<StorageData>; type Callback<T> = (data: T) => void; type Get = <T extends ParamsToGet>(params: T, callback: Callback<T>) => void; declare const get: Get;
在调用函数时:
get({ prop1: false, prop4: "static", prop2: 1}, (data) => { ... });
当前类型推导结果不符合预期:
data: { prop1: false; // 异常,应为boolean prop2: number; // 正常 prop4: "static"; // 正常 }
布尔类型的属性被推导为具体的true/false字面量,而非boolean类型,其他类型推导正常。
问题原因
TypeScript在推导对象字面量的类型时,会对布尔值默认推导为具体的字面量类型(true或false);而对于数字字面量(如1)会自动拓宽为number类型,字符串字面量(如"static")则会保留字面量类型(因为它是"static" | "dynamic"联合类型的成员)。
解决方案
我们可以通过自定义类型工具,将布尔字面量类型拓宽为boolean,同时保留其他类型的推导结果。修改Get类型定义如下:
// 类型工具:将布尔字面量拓宽为boolean,其他类型保持不变 type WidenBoolean<T> = T extends boolean ? boolean : T; type Get = <T extends ParamsToGet>( params: T, callback: Callback<{ [K in keyof T]: WidenBoolean<T[K]> }> ) => void;
修改后的效果
再次调用函数时,类型推导结果将符合预期:
get({ prop1: false, prop4: "static", prop2: 1 }, (data) => { // data类型推导为: // { // prop1: boolean; // prop2: number; // prop4: "static"; // } });
此时prop1的类型被正确推导为boolean,其他属性的类型保持原有正确的推导结果。
内容的提问来源于stack exchange,提问作者Mero
相关产品推荐
相关产品推荐

