TypeScript如何推断对象数组属性值联合类型并约束返回函数参数
解决方案
核心通过TypeScript泛型动态推断入参的实际类型,即可基于传入的数组元素自动收窄f2的参数类型范围,完整实现代码如下:
type A = { key: 'a' }; type B = { key: 'b' }; type C = { key: 'c' }; type Xs = (A | B | C)[]; // 泛型T约束为Xs的元素类型,避免传入不符合要求的其他对象 const fn1 = <T extends Xs[number]>(arg1: T[]) => { return { f2: (arg2: T['key']) => null, }; }; // 应当报错:空数组T推断为never,无有效值可以赋值给never类型 fn1([]).f2('a'); // 应当报错:T推断为{key: 'a'},仅允许接收参数'a' fn1([{ key: 'a' }]).f2('c'); // 类型正确:T推断为{key: 'a'} | {key: 'b'},允许接收参数'a'|'b' fn1([{ key: 'a' }, { key: 'b' }]).f2('a');
逻辑说明
- 给
fn1声明泛型参数T,约束为Xs[number](也就是A|B|C联合类型),保证入参数组的元素只能是预设的三类对象 - 入参
arg1定义为T[]类型,TS会根据实际传入的数组元素自动收窄T的实际范围 - 内层
f2的参数arg2直接取T['key'],也就是所有传入元素的key属性值的联合类型,自动匹配入参的实际情况 - 空数组场景下
T会被推断为never类型,任何值都无法赋值给never,符合空数组调用f2必须报错的要求
内容的提问来源于stack exchange,提问作者user8856277
相关产品推荐
相关产品推荐

