如何基于对象属性创建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
相关产品推荐
相关产品推荐

