定义接口:具有未知编号和属性名称的对象

时间:2018-10-30 10:06:54

标签: typescript interface

我有一个对象foo

interface Foo {
    fooId: string;
    otherStuff: any;
}

现在我有一个对象fooCollection,它是一个包含未定义数量的foos的对象。每个属性都是一个字符串,等于fooId。我该如何为fooCollection定义一个准确的接口?

到目前为止,我想到了这个:

interface FooCollection {
    [key: string]: Foo;
}

-我怎样才能告诉ts财产的数量可以是什么?

-我可以更精确地了解道具名称,说它是fooId而不是任何字符串吗?

1 个答案:

答案 0 :(得分:0)

索引签名[key: string]: Foo已允许任何数量的属性(零个或多个)。

仅编写一种类型,以强制每个属性的名称与fooId对象的Foo相匹配,这超出了TypeScript的类型系统的能力。您可以编写一个FooCollection类型,该类型在所使用的ID集中是通用的,这将允许您编写一个通用函数来验证手写的FooCollection文字:

interface Foo<Id extends string> {
    fooId: Id;
    otherStuff: any;
}

type FooCollection<Ids extends string> = { [Id in Ids]: Foo<Id> };

function checkFooCollection<Ids extends string>
    (fooCollection: FooCollection<Ids>) { 
    return fooCollection;
}

// OK
let c1 = checkFooCollection({
    a: {fooId: "a", otherStuff: 5}
});

// Error
let c2 = checkFooCollection({
    a: {fooId: "b", otherStuff: 5}
});

但是,如果您在运行时构建FooCollection对象,则这种方法不太可能提供比原始方法更多的有意义的检查。