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

如何基于对象属性创建TypeScript数组接口?(Angular环境)

轻松实现TypeScript属性名字数组的类型约束

嘿,这当然可以!TypeScript的类型系统刚好能解决这个需求——咱们用keyof操作符提取接口的属性名,再基于这个定义出严格的数组类型就行。

基础场景:允许任意数量的合法属性名

如果你的数组可以包含任意多个(从0到全部)ObjInterface的属性,但不能出现不存在的属性,直接这么写:

interface ObjInterface { 
  prop1: number; 
  prop2: number; 
  prop3: string; 
}

// 定义数组类型:元素只能是ObjInterface的属性名
type ValidPropArray = Array<keyof ObjInterface>;
// 或者更简洁的写法:(keyof ObjInterface)[]

// ✅ 合法:包含所有属性
const validArray: ValidPropArray = ['prop1', 'prop2', 'prop3'];

// ❌ 报错:'prop4'不是ObjInterface的属性
const invalidArray: ValidPropArray = ['prop1', 'prop2', 'prop4'];

进阶场景:必须包含所有属性名(一个不能少,也不能多)

要是你希望数组必须包含所有属性名,既不能缺属性,也不能加额外的非法属性,那可以结合as const生成严格的元组类型:

interface ObjInterface { 
  prop1: number; 
  prop2: number; 
  prop3: string; 
}

// 先创建一个包含所有属性的只读元组
const allProps = ['prop1', 'prop2', 'prop3'] as const;
// 提取元组的元素类型
type AllPropNames = typeof allProps[number];
// 直接用这个元组类型作为数组的约束
type ExactPropArray = typeof allProps;

// ✅ 合法:完全匹配所有属性
const exactValidArray: ExactPropArray = ['prop1', 'prop2', 'prop3'];

// ❌ 报错:缺少prop3
const missingPropArray: ExactPropArray = ['prop1', 'prop2'];

// ❌ 报错:包含不存在的prop4
const extraPropArray: ExactPropArray = ['prop1', 'prop2', 'prop4'];

原理小科普

  • keyof ObjInterface会生成联合类型'prop1' | 'prop2' | 'prop3',TypeScript会自动校验数组中的每个元素是否属于这个集合,不符合就抛出类型错误。
  • as const把普通数组转换成了只读元组,相当于把数组的元素和长度都固定死了,确保数组完全匹配我们需要的属性列表,既不能少也不能乱加。

这样就能完美满足你的类型校验需求啦!


内容的提问来源于stack exchange,提问作者mr__brainwash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:50:50