如何让TypeScript为不同类型的Feature Flag精准推断值类型?
为功能标志实现精确的TypeScript类型定义
你之前用Record的方式会让所有功能标志的值类型变成boolean | number的联合类型,导致TypeScript无法区分每个标志的具体类型。可以用以下两种方式解决:
方法一:手动定义精确的接口
直接通过interface明确每个功能标志的键和对应类型,这是最直观的方式:
// 可选:如果需要单独提取标志名称类型 type FeatureFlagName = 'foo' | 'bar' | 'another'; // 精确定义每个标志的类型 interface FeatureFlags { foo: boolean; bar: boolean; another: number; } const featureFlagDefaults: FeatureFlags = { foo: false, bar: false, another: 10, }; // 此时类型推断正确: featureFlagDefaults.foo; // 类型为 boolean featureFlagDefaults.another; // 类型为 number
方法二:利用const断言自动推断类型
如果不想手动维护接口,可以用as const断言让TypeScript自动推断最精确的键值类型,同时从默认值中提取所需的类型:
// 定义默认值并使用const断言锁定类型 const featureFlagDefaults = { foo: false, bar: false, another: 10, } as const; // 从默认值提取标志名称类型 type FeatureFlagName = keyof typeof featureFlagDefaults; // 提取完整的功能标志类型 type FeatureFlags = typeof featureFlagDefaults; // 类型推断同样准确: featureFlagDefaults.foo; // boolean featureFlagDefaults.another; // number
为什么原来的方式不行?
Record<FeatureFlagName, boolean | number>会给所有键统一赋予boolean | number的联合类型,TypeScript无法区分每个键对应的具体类型,所以会丢失精确的类型信息。而上面两种方式都能给每个键绑定唯一的类型,确保引用时的类型推断准确。
内容的提问来源于stack exchange,提问作者mellis481
相关产品推荐
相关产品推荐

