打字稿:有条件地将项目添加到对象

时间:2019-12-12 16:40:03

标签: typescript

如果我做一个对象

const data = {}

然后尝试向其添加对象

const data = {};
data.shared = {};

我收到错误Property 'shared' does not exist on type '{}'.ts(2339)

我手动添加

const data = {
    shared: {},
};

然后当我想有条件地添加一个值时回到同样的问题

if (true) data.shared.username = 'test'

Property 'username' does not exist on type '{}'.

2 个答案:

答案 0 :(得分:2)

我将创建一个接口来定义数据结构,如下所示:

interface IData {
    shared?:{
        username?: string;
        // here any other properties you want to conditionally add
    }
}

通过这种方式,编译器始终知道会发生什么

然后您可以将数据声明为:

const data: IData = {}

答案 1 :(得分:2)

尽管apokyrfos的答案是正确的,但使用Typescript的最佳实践是在可能的情况下避免使用any-使用any类型首先会挫败使用Typescript的好处。

您可以做的是使用索引签名声明对象:

const data: {[key: string]: SomeType} = {};

这样,您可以随时分配data.shared,只要“ SomeType”允许您分配的类型即可(如果您在此处分配了不同但相似的对象,考虑使用接口)。