Подпись индекса [key: string]: Foo
уже допускает любое количество свойств (от нуля или более).
Запись одного типа, обеспечивающего совпадение имени каждого свойства с fooId
объекта Foo
, выходит за рамки возможностей системы типов TypeScript. Вы можете написать тип FooCollection
, который является универсальным в наборе используемых идентификаторов, и который позволит вам написать универсальную функцию для проверки рукописных литералов 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
объекты во время выполнения, такой подход вряд ли даст вам более значимую проверку, чем ваш первоначальный подход.