Есть ли способ создать интерфейс типа с динамическим именем поля?

Я хочу построить шрифт вокруг строк:

interface Type<ofWhat>'fieldName'{
    fieldName: ofWhat[];
    otherProps: any;
}

Потому что конечная точка API имеет странный дизайн.

Я пробовал сделать что-то вроде этого:

type Page<T> = {pageInfo: PageInfo} | {[key:string]: Array<T>}

В котором можно подписаться на такие объекты, как:

    const obj2:Page<Card> = {
  pageInfo: {
    totalItens: 0,
    totalPages: 0,
    pageNumber: 0,
    lastPage: true
  },
  cards: [
    {
      header: "string",
      title: "string",
      content: "string",
      lawsuitId: "3fa85f64-5717-4562-b3fc-2c963f66afa6"
    },
  ]
}

Однако это проблематично для линтера, который не понимает, что cards является динамическим именем и помечает его как ошибку.

Есть идеи по улучшению дизайна интерфейса? Спасибо!


person lrdass    schedule 08.02.2021    source источник
comment
stackoverflow.com/questions/57774361/   -  person Roberto Zvjerković    schedule 08.02.2021
comment
Это то, что я сделал. Но есть проблемы с линтером и проверкой статического типа. Но большое вам спасибо за вашу помощь!   -  person lrdass    schedule 09.02.2021


Ответы (1)


Использование Record<> с стесненным типа для ключа похоже проверяет ...

type BasePage = { pageInfo: PageInfo };
type Page<Key extends string, Type> = BasePage & Record<Key, Type[]>;

interface Card {
  header: string;
  title: string;
  content: string;
  lawsuitId: string;
}

interface PageInfo {
  totalItens: number;
  totalPages: number;
  pageNumber: number;
  lastPage: boolean;
}

type CardPage = Page<"cards", Card>;

const obj2: CardPage = {
  pageInfo: {
    totalItens: 0,
    totalPages: 0,
    pageNumber: 0,
    lastPage: true,
  },
  cards: [
    {
      header: "string",
      title: "string",
      content: "string",
      lawsuitId: "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    },
  ],
};

person AKX    schedule 08.02.2021