Определения типов Typescript - наследование - PullRequest
0 голосов
/ 21 января 2020

У меня есть интерфейс машинописного текста, который представляет мои данные в базе данных, например:

interface Foo {
  bar: {
    fish: {
       _id: string,
       name: string,
    }[],
  },

  starwars: string[],
}

Я бы хотел иметь возможность ссылаться на части этого интерфейса. В следующем примере я хочу передать данные за ключом fish в качестве параметров.

Мне удалось заставить его работать:

interface Fish {
  _id: string,
  name: string,
}

interface Foo {
  bar: {
    fish: Fish[],
  },

  starwars: string[],
}

function killTheFish(fish: Fish) { ... }

Но я бы предпочел сделать что-то вроде :

type Fish = Foo.bar.fish;

Знаете ли вы какой-либо способ ссылки на часть интерфейса?

Ответы [ 2 ]

3 голосов
/ 21 января 2020

Да, вы хотите типы поиска, или индексированные типы доступа . Он использует квадратную скобку вместо точечной (которая может конфликтовать с пространствами имен):

type FishArray = Foo["bar"]["fish"]
/*
type FishArray = {
    _id: string;
    name: string;
}[]
*/

type Fish = Foo["bar"]["fish"][number];
/* type Fish = {
    _id: string;
    name: string;
} */

Если у вас есть свойство, имеющее тип T и тип ключа K, который является частью ключи T (K extends keyof T), тогда T[K] - это тип свойства T для этого ключа K. Таким образом, Foo["bar"]["fish"] - это тип, который вы получаете, если у вас есть foo объект типа Foo и прочитанный foo.bar.fish.

Это массив в вашем примере; если вы хотите тип элемента, вы можете получить это. Массивы имеют числовую c индексную подпись , поэтому, если у вас есть ключ типа number, вы получите тип элемента. Итак, Foo["bar"]["fish"][number] это тип элемента.

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

ссылка на игровую площадку

1 голос
/ 21 января 2020

Без лишних слов - мы можем получить доступ к типам элементов сопоставленного типа по индексу / ключу, используя синтаксис типа поиска ['prop']

type FishArr = Foo['bar']['fish'];

Тип массива также соответствует типу Array<X> = {[k:number]: X}, поэтому все ключи имеют тип number, затем таким же образом мы берем тип члена из любого другого сопоставленного типа, мы можем использовать number для элемента типа массива

type Fish = Foo['bar']['fish'][number];
...