【问题标题】:Argument of type 'string | number | number[]' is not assignable to parameter of type 'number[]'?'string | 类型的参数号码 | number[]' 不能分配给'number[]' 类型的参数?
【发布时间】:2020-04-04 16:24:04
【问题描述】:

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

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 时会遇到错误:Argument of type 'string |号码 | number[]' 不能分配给“number[]”类型的参数。类型 'string' 不能分配给类型 'number[]'。

【问题讨论】:

  • 括号在hundredsCount函数内放错了
  • 按如下方式调用您的方法:hundredsCount(person.marks)hundredsCount(person["marks"])
  • @uminder 我尝试了两种方法,但没有运气

标签: typescript


【解决方案1】:

问题是您已将类型 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 只是一个字符串值,则需要使用类型保护来正确指定类型:

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

}

【讨论】:

  • 谢谢,在减速器中应用这个逻辑(函数 k)时还有一个问题,然后我面临同样的错误。
猜你喜欢
  • 2020-06-19
  • 2020-06-19
  • 1970-01-01
  • 1970-01-01
  • 2018-08-15
  • 2019-10-23
  • 2022-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多