运行以下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'.
谢谢!
答案 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 }
}
但是,如果您想更严格地键入此特定数据位,则可以在一个简单的界面中进行操作:
interface ValueType {
name: string
city: string
state: string
age: number
progress: { [date: string]: number }
}