如何使用 TypeScript 确保两个对象具有相同的结构(无接口)?

雷神-x86_128

我目前正在开发一个大量使用国际化(i18n)的网络项目,我很难弄清楚如何确保所有语言共享完全相同的键。

这是一个简单的src/lang/en.ts文件示例:

export default {
  title: "My Website Project",
  description: "This is an example of a file which contains phrases and their keys",
  hello: "Hello!",
};

这是一个简单的src/lang/id.ts文件示例:

export default {
  title: "Proyek Website Saya",
  description: "Ini adalah contoh dari sebuah file yang mengandung beberapa frasa beserta kata kuncinya",
  hello: "Halo!",
};

现在,我希望 TypeScript 确保这些文件具有相同的键(不多也不少)。因此,如果我将cat属性放入src/lang/id.ts,则:

export default {
  title: "Proyek Website Saya",
  description: "Ini adalah contoh dari sebuah file yang mengandung beberapa frasa beserta kata kuncinya",
  hello: "Halo!",
  cat: "Kucing", // <-- this must be error because "cat" doesn't exist in en.ts file!
};

但我无法建立这样的界面

export default interface LanguageStruct {
  title: string,
  description: string,
  hello: string,
};

因为在实际项目中每种语言都有数百个短语,并且一个接一个地编写这些键既费时又费力。我想知道 TypeScript 是否有解决这个问题的技巧,或者至少有某种自动化来完成这项工作。

萨满

用于keyof typeof someObject从对象的键(例如第一语言字符串)构造类型。然后限制您的其他对象(其他语言)将该类型作为键,并将字符串作为值,使用Record. 所以你要找的类型是Record<keyof typeof someObject, string>. 例子:

const en = {
  title: "My Website Project",
  description: "This is an example of a file which contains phrases and their keys",
  hello: "Hello!",
};

const de: Record<keyof typeof en, string> = {
  title: "Proyek Website Saya",
  description: "Ini adalah contoh dari sebuah file yang mengandung beberapa frasa beserta kata kuncinya",
  hello: "Halo!",
  cat: "Kucing", // this is highlighted as an error
};

请参阅此处的工作示例

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何绑定两个具有相同结构的列表?

如何连接两个具有相同 id 的对象

具有两个属性或NEITHER的Typescript接口

Typescript - 如何使用接口创建符合不同结构的新对象

是否可以要求两个不同的TypeScript接口具有相同的键但能够具有不同的值?

比较两个文件的标题,并确保无论顺序如何,它们都具有相同的标题

使用rsync确保两个目录具有完全相同的文件

如何从Typescript中具有相同json对象结构的另一个数组更新数组中的json对象值

TypeScript:如何为具有许多相同类型的键和相同类型的值的对象创建接口?

如何在Racket中测试两个结构实例是否具有相同的结构类型?

如何在Typescript中使用具有参数value或value []的两个参数编写泛型函数

在Java 8中使用具有相同签名的两个默认方法实现两个接口

如何实现两个具有相同名称的方法的接口?

Kotlin,使用相同的方法实现两个接口并具有默认值

TypeScript:如何创建类型或接口,该类型或接口是具有n个键之一或字符串的对象?

如何以相同的顺序比较两个具有相同元素的JSON对象相等?

如何根据另一个属性的键在接口中键入属性在 TypeScript 中具有未知结构?

如何使用AssertJ递归比较具有不同字段名称但具有相同值的两个对象

当两个结构具有相同的字段时,如何逐个元素相加,相减等

如何合并具有相同结构的两个mysql表

具有相同名称和不同模板参数的两个结构如何工作

如何检查两个结构在Swift中是否具有相同的泛型参数类型?

如何在不克隆的情况下测试两个结构具有相同的值?

SQL | 如何比较具有相同结构的两个表

如何仅从具有相同表结构的两个表中获取更新的列值

对象列表,如何组合具有两个键值相同的对象

当两个元素的高度由其内容定义时,如何确保两个元素在所有屏幕宽度上具有相同的高度?

两个如何使用两个具有相同刀片名称的降价主题?

即使标签具有不同的值,如何确定两个XML文件是否具有相同的结构?