用键和数组打字稿写一个对象

时间:2019-02-06 15:40:03

标签: javascript typescript

我正在用打字稿写以下内容,并看到以下错误

const WEEKDAYS_SHORT = {
    en: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
    de: ['S', 'M', 'D', 'M', 'D', 'F', 'S'],
};

<StyledDayPicker weekdaysShort={WEEKDAYS_SHORT[language]} />
  

类型'string []'不能分配给类型'[string,string,string,string,string,string,string]'。     类型'string []'中缺少属性'0'。 [2322]

我尝试了以下操作,这给了我一个错误。

const WEEKDAYS_SHORT: string[] = {
    en: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
    de: ['S', 'M', 'D', 'M', 'D', 'F', 'S'],
};

2 个答案:

答案 0 :(得分:1)

weekdaysShort期望一个长度为7的字符串元组。默认情况下,typescript会推断出fir数组文字的数组。一种简单的解决方案是为美国提供一个额外的功能来帮助推断:

const stringTuple = <T extends string[]>(...a: T) => a;

const WEEKDAYS_SHORT = {
    en: stringTuple('S', 'M', 'T', 'W', 'T', 'F', 'S'),
    de: stringTuple('S', 'M', 'D', 'M', 'D', 'F', 'S')
};

或者您可以使用类型断言:

type Tuple7 = [string,string,string,string,string,string,string]
const WEEKDAYS_SHORT = {
    en: ['S', 'M', 'T', 'W', 'T', 'F', 'S'] as Tuple7,
    de: ['S', 'M', 'D', 'M', 'D', 'F', 'S'] as Tuple7,
};

或者在打字稿3.4(目前未发布)中,您可以断言as const以使编译器推断出一个只读元组:

const WEEKDAYS_SHORT = {
    en: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
    de: ['S', 'M', 'D', 'M', 'D', 'F', 'S'],
} as const;

还取决于您的编译器设置,并且language应该为'en' | 'de',以使索引工作。

答案 1 :(得分:0)

您的变量应这样定义:

const WEEKDAYS_SHORT: { [prop: string]: string[] } = {
    en: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
    de: ['S', 'M', 'D', 'M', 'D', 'F', 'S'],
};