代码之家  ›  专栏  ›  技术社区  ›  Thor-x86_128

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

  •  1
  • Thor-x86_128  · 技术社区  · 2 年前

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

    下面是一个简单的例子 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的技巧,或者至少有某种自动化来完成这项工作。

    1 回复  |  直到 2 年前
        1
  •  1
  •   szaman    2 年前

    使用 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
    };
    

    参见工作示例 here .