TS中的字典

时间:2019-01-28 08:04:44

标签: javascript typescript

我想在TS中制作简单的字典。

可以,但是出现错误:

  

元素隐式地具有“ any”类型,因为类型为“ {'票务字段是必需的。”:字符串; “所选票证无效。”:字符串; }'没有索引签名。

我的代码:

const translation = {
  'The ticket field is required.': 'Musisz podać numer swojego biletu.',
  'The selected ticket is invalid.': 'Wybrany bilet jest nieprawidłowy.'
};

this.error = translation['The ticket field is required.']; 

2 个答案:

答案 0 :(得分:2)

当您这样声明值translation时:

const translation = {
  'The ticket field is required.': 'Musisz podać numer swojego biletu.',
  'The selected ticket is invalid.': 'Wybrany bilet jest nieprawidłowy.'
};

您将省略类型声明。这意味着translation被隐式键入 。如果要显式声明各个类型,则const声明应如下所示:

const translation:
{
    //This is the type declaration
    'The ticket field is required.': string;
    'The selected ticket is invalid.': string;
} = {
    //This is the value
    'The ticket field is required.': 'Musisz podać numer swojego biletu.',
    'The selected ticket is invalid.': 'Wybrany bilet jest nieprawidłowy.'
};

由于您将值声明为const,所以编译器知道唯一的属性就是您提供的属性。

当您现在像...那样访问您的类型时

this.error = translation['The ticket field is required.'];

...您将其用作映射类型。由于编译器看不到(因为未检查)您提供的键与推断类型的属性名称之一匹配,因此它将假定表达式translation['The ticket field is required.']的类型为{{1 }}。由于这是一个隐式any,并且您处于严格模式,因此会出现错误。

简单的解决方案是为您的值提供显式输入:

any

答案 1 :(得分:1)

只需尝试提供类型提示:

const translation = {
  'The ticket field is required.': 'Musisz podać numer swojego biletu.',
  'The selected ticket is invalid.': 'Wybrany bilet jest nieprawidłowy.'
} as { [index:string] : string };