Typescript 类型为'的参数;字符串| number | number[]和#x27;不可分配给类型为';编号[]和#x27;?

Typescript 类型为'的参数;字符串| number | number[]和#x27;不可分配给类型为';编号[]和#x27;?,typescript,Typescript,我正在尝试存储typescript对象,其中key作为字符串,value作为number | number[]|字符串 interface Person { [ key : string] : number | number[] | string } const person:Person = { "name" : "Harsha", "marks" : [ 89, 90 , 100 , 67], "class" : 8 } function hundredsCount(marks: n

我正在尝试存储typescript对象,其中key作为字符串,value作为number | number[]|字符串

interface Person {
  [ key : string] : number | number[] | string
}

const person:Person = {
"name" : "Harsha",
"marks" : [ 89, 90 , 100 , 67],
"class" : 8
}

function hundredsCount(marks: number[]) {
  const count:number = marks.map((each:number) => each).length
}

hundredsCount(person[marks])

调用HundredCount时,遇到一个错误:类型为“string | number | number[]”的参数不能赋值给类型为“number[]”的参数。类型“string”不可分配给类型“number[]”。

问题是您已将类型
Person
声明为非常宽的类型,可以具有任何字符串键,并具有三种不同类型的值。这意味着,当您访问表示
Person
TS的值的任何属性时,TS无法将其类型与声明中所述的-
number | number[]| string
区分开来

解决方案是使用更严格的类型:

interface Person {
    name: string,
    marks: number[],
    'class': number,
}
之后,
person['marks']
被推断为
number[]


如果类型不能如此具体,假设有动态键,但您知道有像
标记
键这样的东西,那么我们可以有更宽的类型:

interface Person {
    [ key : string] : number | number[] | string
    marks: number[]
}

此外,如果您试图访问
person[k]
,其中
k
只是一个字符串值,则需要使用typeguard来正确指定类型:

function f(k: string) {
    if (k === 'marks') {
        hundredsCount(person[k]); // inside if person[k] is known as number[]
    }
    // outside person[k] is known as number | number[] | string

}


括号放错了
hundrescount
函数调用您的方法如下:
hundrescount(person.marks)
hundrescount(person[“marks]”)
@uminder我尝试了两种方法,但都没有成功,在减速器中应用此逻辑(函数k)时,还有一个问题,那么我将面临相同的错误。