определить интерфейс: объект с неизвестным номером и именем свойства - PullRequest
0 голосов
/ 30 октября 2018

У меня есть объект foo

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

Теперь у меня есть объект fooCollection, который является объектом, содержащим неопределенное количество foos. Каждое свойство представляет собой строку, равную fooId. Как я могу определить точный интерфейс для fooCollection?

Пока я придумал это:

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

-Как я могу сказать, что количество имущества может быть любым?

- Могу ли я быть более точным в отношении названия реквизита, говоря, что это fooId вместо какой-либо строки?

1 Ответ

0 голосов
/ 31 октября 2018

Подпись индекса [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 объекты во время выполнения, такой подход вряд ли даст вам более значимую проверку, чем ваш первоначальный подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...