You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 19:43:20