我有一个对象foo
interface Foo {
fooId: string;
otherStuff: any;
}
现在我有一个对象fooCollection,它是一个包含未定义数量的foos的对象。每个属性都是一个字符串,等于fooId。我该如何为fooCollection定义一个准确的接口?
到目前为止,我想到了这个:
interface FooCollection {
[key: string]: Foo;
}
-我怎样才能告诉ts财产的数量可以是什么?
-我可以更精确地了解道具名称,说它是fooId而不是任何字符串吗?
答案 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
对象,则这种方法不太可能提供比原始方法更多的有意义的检查。