Typescript - как указать тип, который позволяет добавлять произвольные дополнительные ключи к базовому интерфейсу - PullRequest
0 голосов
/ 08 мая 2020

Как мне указать интерфейс в Typescript, который разрешает произвольные дополнительные ключи поверх набора требуемых ключей? Другими словами, интерфейс произвольно расширяет другой интерфейс. Например:

interface base {
  foo: string;
}

const arr:<<type extends base>>[] = [ // I don't know how to do this!
 {
   foo: 'fie', // acceptable
 },
 {
   foo: 'fum',
   bar: 'boo', // also acceptable
 },
 {
   bar: 'bee' // not acceptable
 },
];

Ответы [ 2 ]

1 голос
/ 08 мая 2020

В дополнение к ответу христиан, вы также можете просто сделать это один interface:

interface IMyBaseInterface {
    foo: string;
    [key: string]: any;
}


const arr: IMyBaseInterface[] = [
    { foo: 'bar', bar: 'foo' },
    { foo: 'bar', bar: 'foo', test: 1 }
]

TS Playground

1 голос
/ 08 мая 2020

Вы можете добавить подпись индекса в виде записи к любому интерфейсу следующим образом:

interface Base {
    value: number;
}

interface Extension extends Base {
    [key: string]: unknown;
}

В дополнение к свойствам из Base новый интерфейс Extension теперь будет принимать любые дополнительные произвольные свойства с ключи типа string.

Другой альтернативой, возможно, более понятным для человека решением, является написание типа, расширяющего ваш Base и Record тип:

type TypeExtension = Base & Record<string, unknown>;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...