数组元素上不存在该属性

时间:2019-04-01 12:46:54

标签: typescript

我正在尝试返回一个包含初始化对象和数字的数组。

但是我遇到以下错误:

  

类型'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

我该如何解决?

1 个答案:

答案 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