我正在尝试返回一个包含初始化对象和数字的数组。
但是我遇到以下错误:
类型'number |类型上不存在属性'foo' IObj'属性'foo' 类型'number'上不存在
interface IObj {
[k: string]: string
}
function test(fields: string[]){
const foo: IObj = {}
fields.forEach((x) => foo[x] = 'baz')
return [foo, 1]
}
const [foo, x] = test(['foo'])
foo.foo
我该如何解决?
答案 0 :(得分:1)
对于数组文字,默认情况下,typescript会推断出一个数组,因此,在发生解构时,每个元素将为IObj | number
,第一个元素为IObj
而第二个元素为数字的信息将丢失。
在最近发布的3.4版本中,您可以使用as const
来使编译器推断一个只读元组(return [foo, 1] as const
)
或者您可以使用显式类型注释来告诉编译器您想要一个元组:
interface IObj {
[k: string]: string
}
function test(fields: string[]) : [IObj, number]{
const foo: IObj = {}
fields.forEach((x) => foo[x] = 'baz')
return [foo, 1]
}
const [foo, x] = test(['foo'])
foo.foo
如果您要对fields
参数使用常量,我是否可以建议您使用更安全的代码版本:
function test<K extends string>(fields: K[]) : [Record<K, string>, number]{
const foo = {} as Record<K, string>
fields.forEach((x) => foo[x] = 'baz')
return [foo, 1]
}
const [foo, x] = test(['foo'])
foo.foo //ok
foo.foo2 // err