Как объявить интерфейс TypeScript с переменным количеством свойств? - PullRequest
0 голосов
/ 10 июля 2020

Это простой вопрос, и я удивлен, что нигде не могу найти на него четкого ответа. Я создаю API, и мне нужно определить интерфейс, который может иметь несколько (строковых) свойств, но для них нет заданного количества свойств и заданных имен (но все они должны иметь строковые значения). Таким образом, все следующие объекты будут соответствовать типу:

{ slot: "ten" }

{ class: "Luxury", base: "never", city: "Timbuktu" }

{ slot: "ten", class: "Luxury" }

Я подумал о следующем.

interface MyInterface {
    [key: string]: string;
}

Но для меня это означает, что объекты могут иметь только одно свойство (с разными именами), вместо того, чтобы иметь несколько свойств (с разными именами).

Как лучше всего это сделать? Обратите внимание, что я не могу контролировать, какие имена свойств будет использовать код, вызывающий мой API. Вызывающие могут использовать любые имена свойств, какие захотят.

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Ваш interface может выглядеть так, как будто он принимает только одно свойство, которое должно иметь тип string, но на самом деле это синтаксис, используемый для определения интерфейса с любым количеством свойств, которые все имеют одни и те же характеристики (строки как ключи и строки как значения). Это называется индексируемым типом (кредиты для @ axia c, я не знал, что у него есть имя).

Так что нет ничего плохого в том, чтобы сохранить интерфейс таким, какой он есть:

interface MyInterface {
    [key: string]: string;
}

Typescript поставляется с собственным типом служебной программы под названием Record , который сводится к тому же самому, но более кратко:

type MyInterface = Record<string, string>;

Функционально разницы между два, которые вы выберете, на ваше усмотрение.

0 голосов
/ 10 июля 2020

Вы не можете и не должны этого делать. В этом весь смысл интерфейсов - иметь набор определенных типов. что вы можете сделать: определить все ожидаемые имена свойств и пометить их как необязательные или провести рефакторинг своих моделей. Старайтесь избегать [ключ: строка]: строка; он скомпилируется сейчас, но позже у вас будет головная боль, пытаясь исправить эти ошибки.

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