如何基于现有字符串数组声明TS类型以指定属性名?
基于字符串数组创建TypeScript类型并初始化对象
要实现基于现有字符串数组生成对应属性名的类型,核心是让TypeScript保留数组元素的具体字面量值,而非将其视为宽泛的string[]类型。具体实现步骤如下:
1. 锁定数组元素的字面量类型
使用as const断言定义数组,让TypeScript记住每个元素的具体值:
const propertiesForType = [ "myProperty1", "myProperty2" ] as const;
此时propertiesForType的类型为readonly ["myProperty1", "myProperty2"],而非普通的string[]。
2. 提取属性名联合类型
从数组类型中提取所有元素的类型,得到属性名的联合类型:
type PropertyNames = typeof propertiesForType[number]; // 类型结果:"myProperty1" | "myProperty2"
3. 创建映射类型
基于联合类型生成包含指定属性的对象类型:
type myTypeFromArray = { [K in PropertyNames]: any; // 每个属性对应any类型,可按需替换为具体类型 };
如果需要属性为可选,可添加?修饰符:
type myTypeFromArrayOptional = { [K in PropertyNames]?: any; };
4. 初始化符合类型的对象
非可选类型下,TypeScript会强制要求对象包含所有指定属性:
let myMappedObject: myTypeFromArray = { myProperty1: "hello", myProperty2: 456 };
内容的提问来源于stack exchange,提问作者goose_lake
相关产品推荐
相关产品推荐

