为什么Typescript抱怨对象不能分配给它的类型?

时间:2020-07-22 17:57:02

标签: javascript typescript object types

运行以下TypeScript代码时:

type valueType = {[key: string]: number} | {[key: string]: {[date: string]: number}} | {[key: string]: string;}


const myData1: valueType = {
  "name": "Eduardo",
  "city": "Miami",
  "state": "FL",
  "age": 22,
  "progress": {"2018": 67, "2019": 76, "2020": 89}
}

TypeScript抱怨对象不能分配给类型valueType,尽管我明确地告诉它对象内部可以有不同的类型。在对象内允许多种不同类型的正确方法是什么?

这是我得到的警告:

Type '{ "name": string; "city": string; "state": string; "age": number; }' is not assignable to type 'valueType'.
  Type '{ "name": string; "city": string; "state": string; "age": number; }' is not assignable to type '{ [key: string]: string; }'.
    Property '"age"' is incompatible with index signature.
      Type 'number' is not assignable to type 'string'.

谢谢!

2 个答案:

答案 0 :(得分:1)

您的代码中valueType类型的问题是,您告诉打字稿该类型将具有键值对,其中键是字符串,而所有值都是数字或字符串,或者是类型{ {1}}。但是,您需要的是在同一对象中具有{[date: string]: number}}键和string / number值的类型。

尝试一下:

string

如果您希望您的类型具有固定键:

type valueType = {[key: string]: number | string | { [date: string]: number }};

const myData1: valueType = {
  "name": "Eduardo",
  "city": "Miami",
  "state": "FL",
  "age": 22,
  "progress": {"2018": 67, "2019": 76, "2020": 89}
}

答案 1 :(得分:1)

{ [key: string]: number }

此类型表示所有属性都必须是数字。

{ [key: string]: { [date: string]: number } }

此类型表示所有属性必须是一个对象,所有属性均为数字。

{ [key: string]: string; }

此类型表示所有属性都必须是字符串。

type valueType =
    | { [key: string]: number }
    | { [key: string]: { [date: string]: number } }
    | { [key: string]: string; }

此类型表示它是以上三种可能性之一。这意味着它必须是所有数字,所有字符串或所有对象。

它不允许您混合和匹配它们。

因此,我认为您的工会在错误的地方。您想要一种对象类型,但是 properties 可以是三种可能性中的任何一种。

type ValueType = {
  [key: string]: number | string | { [date: string]: number }
} 

Playground


但是,如果您想更严格地键入此特定数据位,则可以在一个简单的界面中进行操作:

interface ValueType {
  name: string
  city: string
  state: string
  age: number
  progress: { [date: string]: number }
}

Playground

相关问题