TypeScript如何从const字符串数组生成类型键,动态定义FiatExchangeRates类型
实现方案
你可以直接利用TypeScript的索引访问类型搭配内置Record工具类型或者手写映射类型实现,核心逻辑如下:
- 你定义的
currencies已经加了as const断言,TypeScript会将它推导为只读的字面量数组类型,而非宽泛的string[] - 通过
typeof currencies[number]可以拿到数组所有元素组成的字面量联合类型:'eur' | 'usd' | 'gbp' | 'chf' - 把这个联合类型作为对象的键的类型,值设定为
number即可
完整可运行代码示例:
const currencies = ['eur', 'usd', 'gbp', 'chf'] as const; // 写法1:用内置Record工具类型,更简洁 type FiatExchangeRates = Record<typeof currencies[number], number>; // 写法2:手写映射类型,扩展性更高(需要加可选、只读修饰符直接调整即可) // type FiatExchangeRates = { // [key in typeof currencies[number]]: number // } const fiatExchangeRates: FiatExchangeRates = { eur: 1.11, usd: 1.12, gbp: 1.13, chf: 1.14, }; const a = fiatExchangeRates.eur; // 类型会自动推导为number
后续你需要新增货币类型时,只需要修改currencies数组的内容,FiatExchangeRates会自动同步更新类型,少写对应键、键名拼写错误都会触发TypeScript类型报错。如果允许部分货币汇率可选,可以给映射类型加可选修饰符:
type OptionalFiatExchangeRates = { [key in typeof currencies[number]]?: number }
内容的提问来源于stack exchange,提问作者TNKDev
相关产品推荐
相关产品推荐

