Явная типизация - массив объектов - PullRequest
0 голосов
/ 27 апреля 2018

В приведенном ниже синтаксисе,

interface IPerson{
    firstName: string;
    lastName?: string;
}

const personList = [
    "p1": {firstName: "F1", lastName: "L1"},
    "p2": {firstName: "F2"},
    "p3": {firstName: "F3"}
];

// or

const personList = [
    {"p1": {firstName: "F1", lastName: "L1"}},
    {"p2": {firstName: "F2"}},
    {"p3": {firstName: "F3"}}
];

personList - это массив пар ключ: значение, где ключ имеет тип string, а значение имеет тип IPerson

Edit:

Ниже синтаксис допускает более одной пары ключ: значение в индексе массива

const personList:{[key:string]:IPerson}[] = [
    {
     "p1": {firstName: "F1", lastName: "L1"},
     "p2": {firstName: "F1", lastName: "L1"}   
    },
    {"p2": {firstName: "F2"}},
    {"p3": {firstName: "F3"}}
];

Как явно набрать personList?

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018

Вы можете создать интерфейс карты:

interface Map<T> {
    [K: string]: T;
}

const personList: Map<IPerson> = [];
0 голосов
/ 27 апреля 2018

Тип индекса нельзя ограничить одним свойством, поэтому оба опубликованных ответа, вероятно, так же хороши, как и вы.

В качестве альтернативы вы можете использовать тип кортежа :

const personList: [string, IPerson][] = [
    ["p1", { firstName: "F1", lastName: "L1" }],
    ["p2", { firstName: "F2"}],
    ["p3", { firstName: "F3" }]
];

Это ограничит каждый элемент массива массивом [string, IPerson]:

personList.forEach(item => {
    const [key, person] = item;
    // `key` is type string (p1, p2, p3...)
    // `person` is type IPerson
});
0 голосов
/ 27 апреля 2018
const personList: { [key: string]: IPerson }[]  = [
    {"p1": {firstName: "F1", lastName: "L1"}},
    {"p2": {firstName: "F2"}},
    {"p3": {firstName: "F3"}}
];

Определите его как массив объектов, ключом которых является строка и значение которых имеет тип IPerson

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