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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 00:18:03