Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 用于检测重复对象(例如多语言字段)中缺少的属性的类型定义规则_Typescript_Type Definition - Fatal编程技术网

Typescript 用于检测重复对象(例如多语言字段)中缺少的属性的类型定义规则

Typescript 用于检测重复对象(例如多语言字段)中缺少的属性的类型定义规则,typescript,type-definition,Typescript,Type Definition,假设我有一个类型定义,如: export type TextMessagesType = { [language: string]: { [placeholder: string]: string; }; }; 在这种情况下,这是合适的: export const TextMessages: TextMessagesType = { en: { noText: 'No Texts available!', }, }; 现在,如果我想添加新语言和新属性,如: e

假设我有一个类型定义,如:

export type TextMessagesType = {
  [language: string]: {
    [placeholder: string]: string;
  };
};
在这种情况下,这是合适的:

export const TextMessages: TextMessagesType = {
  en: {
    noText: 'No Texts available!',
  },
};
现在,如果我想添加新语言和新属性,如:

export const TextMessages: TextMessagesType = {
  en: {
    noText: 'No Texts available!',
    welcome: 'You are welcome'
  },
  de: {
    noText: 'Keine weiteren Texte vorhanden!',
    // welcome missing
  },
};
我希望确保
de
-对象与
en
-对象具有完全相同的属性。IDE应该识别由于类型定义而丢失的属性(例如,
welcome

我可以在typescript类型定义规则的帮助下这样做吗?如果是,如何进行

编辑:对不起,我想有一个重要信息丢失了:


识别机制应根据每个对象中的现有属性工作。想象一下
de
对象有一个属性
xy
,它在
en
对象中缺失,反之亦然。如果一个语言对象获得一个新属性,那么它应该在所有其他语言对象中标记为缺少的属性

我们可以使用字符串的联合类型来实现这一点,在键的类型上使用
in
关键字:

type RequiredLanguageFields='welcome'
|“noText”;
类型TextMessagesType={
[语言:string]:{
[所需语言字段中的占位符]:字符串;
};
};
const TextMessages:TextMessagesType={
嗯:{
noText:'没有可用的文本!',
欢迎:'不客气'
},
de:{//此行出现类型错误
noText:“Keine weiteren Texte vorhanden!”,
//欢迎失踪
},
};
属性“welcome”在类型“{noText:string;}”中丢失,但在类型“{welcome:string;noText:string;}”中是必需的。(2741)

在将必填字段添加到对象之前,需要定义这些字段,这是一点额外的工作。或者,您可以拥有一些主翻译对象,并使用该对象的键定义其他对象所需的键:

const enStrings={
noText:'没有可用的文本!',
欢迎:'不客气',
};
类型TextMessagesType={
[语言:string]:{
[enStrings类型的keyof中的占位符]:字符串;
};
};

基于对您问题的编辑,我将尝试描述为什么我认为不可能以您希望的方式创建类型

现在我们要说的是,所有的值都必须是相同类型的对象——它们都必须具有相同的属性,并且所有这些属性都必须是字符串。但那是什么类型的?我们可能会定义一些接口,该接口采用泛型:

接口ITextMessagesType{
[语言:string]:{
[keyof T中的占位符]:字符串;
};
};
const TextMessages:ITextMessagesType={//此处出错,因为我们没有传入泛型`T的类型`
嗯:{
noText:'没有可用的文本!',
欢迎:'不客气'
},
de:{//此行出现类型错误
noText:“Keine weiteren Texte vorhanden!”,
//欢迎失踪
},
};
我们仍然需要定义什么是泛型;我们回到了我上面给出的原始示例的问题上——在定义对象之前,您需要定义键

在函数中更容易一些,因为我们可以从传入的对象推断类型。但接下来我们要讨论下一个问题;哪个对象被视为所需类型?以以下代码为例:

const test=(x:{[key:string]:{[key-in-keyof-T]:string})=>true;
常数x=测试({
嗯:{
noText:'没有可用的文本!',
欢迎:'不客气',//现在我们在这里得到一个类型错误
},
de:{
noText:“Keine weiteren Texte vorhanden!”,
//欢迎失踪
},
})
我们得到的错误是:

类型“{noText:string;welcome:string;}”不可分配给类型 “{noText:string;}”。对象文字只能指定已知的 属性,并且类型{noText:string; }"(2322)

这里,Typescript已确定
de
处的值为“主”类型,因此在中给出了一个错误,我们试图在
en
上定义
welcome


因此,我不相信你能得到你想要的东西-希望有人会进来证明我错了。

谢谢你,奥利弗,但是识别机制应该根据每个对象中现有的属性来工作。假设
de
对象有一个属性
xy,
,它在
en
对象中缺失,反之亦然。请原谅我的问题不准确,我已经做了一个补充。@好的,当然-我已经更新了答案;我很确定你不能用打字机打字,虽然我希望我被证明是错的谢谢你,奥利弗,我得出了同样的结论,但我很不确定,因为我还不是一个打字专家。@孤独的是,我永远对打字机中可能出现的情况感到惊讶,所以你可能会发现在这方面有可能得到一个好的字体-祈祷吧@孤独我相信有足够的时间来回答一个单独的问题;我已经问过了