TypeScript方法参数用联合类型时强制要求所有键的警告如何处理
问题
为什么我不能只传Foo不传Bar?具体来说我该如何修改,才能允许传入二者其一或同时传入二者,同时对不在允许范围内的键抛出错误?
这个TypeScript警告让我非常困惑。
涉及的代码文件包括index.ts、service.ts、serviceConfig.ts,我推测我的Service方法中dataWithValidKeys: { [key in validKeys]: any }的写法存在错误。
问题原因
你当前的写法{ [key in ValidKeys]: any }是默认所有键必选的映射类型,TypeScript会要求每一个枚举到的键都必须在参数中存在,因此你不能只传单个键。
解决方案
根据你的需求有两种可选实现方式:
- 允许传0个、1个或2个指定键,禁止额外键
直接给映射类型的键添加可选修饰符?即可:
// 假设ValidKeys是已定义的字面量联合类型,比如 'Foo' | 'Bar' type AllowedData = { [key in ValidKeys]?: any }
- 要求至少传1个指定键,禁止额外键
可以通过自定义泛型实现强校验:
type ValidKeys = 'Foo' | 'Bar' // 自定义泛型:要求对象至少包含T中的一个键 type AtLeastOneKey<T> = { [K in keyof T]: Pick<T, K> & Partial<Omit<T, K>> }[keyof T] type AllowedData = AtLeastOneKey<Record<ValidKeys, any>>
如果你的validKeys是运行时的数组,需要先将其转为常量类型再提取字面量类型,避免类型丢失:
// 运行时的合法键数组 const validKeys = ['Foo', 'Bar'] as const // 提取出字面量联合类型 'Foo' | 'Bar' type ValidKeys = typeof validKeys[number]
内容的提问来源于stack exchange,提问作者MagicLuckyCat
相关产品推荐
相关产品推荐

