我正在尝试使用键作为字符串和值作为数字来存储打字稿对象|数字[] |字符串。
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 []'类型的参数。不能将“字符串”类型分配给“数字[]”类型。
答案 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
}