如何为TypeScript接口的所有属性统一定义类型?
解决国际化字符串接口重复定义类型的问题
当然有办法啦!在TypeScript里,我们可以用两种方式轻松搞定这个重复写: string的麻烦,完美适配你有几百个字符串属性的场景:
方案一:索引签名(适合不限制具体键名的场景)
如果你的接口只需要保证所有属性值都是字符串,不需要严格限定键名,可以直接用索引签名:
interface ILocaleStringsProvider { [key: string]: string; }
这种写法非常简洁,任何字符串类型的键对应的属性值都会被自动推断为string类型。不过要注意,它不会约束你必须包含哪些特定的键(比如foo、bar这些),如果需要严格控制键名的话,看下面的方案。
方案二:映射类型+联合类型(适合严格约束键名的场景)
如果你需要确保接口必须包含指定的几百个键,同时每个键的类型都是string,可以先把所有键名定义成一个联合类型,再结合Record映射类型来生成接口:
// 先把所有需要的字符串键名列成联合类型 type LocaleKeys = 'foo' | 'bar' | 'baz' | 'blablabla' /* 这里继续加其他几百个键 */; // 用Record快速生成每个键对应string类型的接口 interface ILocaleStringsProvider extends Record<LocaleKeys, string> {} // 或者直接用类型别名也可以 // type ILocaleStringsProvider = Record<LocaleKeys, string>;
这种方式的好处是:既严格约束了接口必须包含哪些键,又不用逐个写: string,以后要新增或修改键名,只需要在LocaleKeys里调整就行,维护起来特别方便。
进阶:混合其他类型属性
如果你的接口除了这些国际化字符串,还需要其他类型的属性,也可以混合写法:
type LocaleKeys = 'foo' | 'bar' | 'baz' | 'blablabla'; interface ILocaleStringsProvider extends Record<LocaleKeys, string> { // 这里可以添加其他非字符串类型的属性 currentLocale: 'zh-CN' | 'en-US'; }
内容的提问来源于stack exchange,提问作者user3016883
相关产品推荐
相关产品推荐

