Typescript - ключ значений массива - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть список

export const list = [
  {
    name: 'parentTitle',
  },
  {
    name: 'anotherTitle',
  },
  {
    name: 'whatever',
  },
];

Теперь я хочу динамически создать тип объединения, который описывает следующее:

type Title = 'parentTitle' | 'anotherTitle' | 'whatever';

Есть ли способ сделать это?

Я попытался адаптировать эту идею здесь: Ключ вложенных дочерних объектов Но я не могу понять это

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Тип list в вашем примере выводится компилятором как Array<{name: string}>, и, таким образом, компилятор полностью забыл конкретные строковые литеральные типы свойств name к тому времени вы пытаетесь определить Title.

Вам придется изменить, как вы назначаете list, хотя бы несколько. Самое простое, что можно сделать (что может или не может удовлетворить ваши потребности), это использовать const утверждение , которое просит компилятор вывести как можно более узкий тип:

export const list = [
    { name: 'parentTitle', },
    { name: 'anotherTitle', },
    { name: 'whatever', },
] as const;

Теперь предполагается, что list имеет тип:

/* 
const list: readonly [
    { readonly name: "parentTitle";}, 
    { readonly name: "anotherTitle";}, 
    { readonly name: "whatever";}
]
*/

, который является кортежем, доступным только для чтения, только для чтения с конкретными свойствами name в определенном порядке. Исходя из этого, мы можем использовать типы поиска для определения Title:

type Title = typeof list[number]["name"];
// type Title = "parentTitle" | "anotherTitle" | "whatever"

Хорошо, надеюсь, это поможет; удачи!

Детская площадка ссылка на код

0 голосов
/ 20 февраля 2020

Вы можете создать для него интерфейс и сделать из него тип массива.

interface Title {
    name: 'parentTitle' | 'anotherTitle' | 'whatever';
}

let list: Title[] = [
  {
    name: 'parentTitle',
  },
  {
    name: 'anotherTitle',
  },
  {
    name: 'whatever',
  },
];
...