类型'string |的参数编号数字[]'不能分配给类型为'数字[]'的参数吗?

时间:2019-12-11 11:33:20

标签: typescript

我正在尝试使用键作为字符串和值作为数字来存储打字稿对象|数字[] |字符串。

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])

当我调用 hundredsCount 时遇到错误:类型'string |编号不能将number []'分配给'number []'类型的参数。不能将“字符串”类型分配给“数字[]”类型。

1 个答案:

答案 0 :(得分:0)

问题是您已将类型Person声明为非常宽的类型,可以具有任何字符串键以及三种不同类型的值。这意味着,当您访问表示Person的值的那些属性中的任何一个时,TS都无法将其类型与声明的内容{number | number[] | string区别开。

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

interface Person {
    name: string,
    marks: number[],
    'class': number,
}

之后,将person['marks']推断为number[]


如果类型不能那么具体,可以说有动态键,但是您知道诸如marks键之类的东西,那么我们可以拥有更宽的类型:

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

}