TypeScript中如何基于字符串数组生成object type或interface
实现方案
方案1:从预期键名数组直接生成(最简实现)
首先给数组添加as const断言保留字面量类型,再结合TS内置的Record工具类型即可实现:
// 必须加as const,避免类型被收窄为普通string数组 const expectedKeys = ['timestamp', 'price'] as const; // 一行生成目标类型 type ExpectedType = Record<typeof expectedKeys[number], string>;
生成的ExpectedType完全符合需求,等效结构如下:
type ExpectedType = { timestamp: string; price: string; }
注意:如果省略
as const断言,TS会把expectedKeys推导为string[]类型,最终生成的类型会变成通用索引签名{ [key: string]: string },丢失精确的键名约束。
方案2:从结构对象反向生成(适合需要运行时校验的场景)
如果你需要在运行时过滤接口返回的多余字段,也可以从结构对象出发,同时得到类型和运行时可用的键数组,避免两端重复维护:
const objectWithExpectedShape = { timestamp: '', price: '', }; // 生成类型 type ExpectedType = typeof objectWithExpectedShape; // 反向提取运行时可用的键数组 const expectedKeys = Object.keys(objectWithExpectedShape) as Array<keyof ExpectedType>;
内容的提问来源于stack exchange,提问作者qnilab
相关产品推荐
相关产品推荐

