Интерфейсы TypeScript и ключи Dynami c - PullRequest
0 голосов
/ 07 мая 2020

Надеюсь, это можно сделать.

Условие простое - у меня 2 типа.

type Numbers: Number[];
type Name: string;

Допустим, они представляют данные, которые я где-то извлек:

// first provider sends it like this
{ "numbers": [2, 3, 4], "name": "Mike" }

// second uses different API keys, even though the data type is the same
{ "numeros": [ 7, 8 ], "nombre": "Jose" }

Я понятия не имею, как создатели API назвали свои свойства, я просто знаю, что возвращаемая полезная нагрузка будет иметь 2 разных свойства - одно с Numbers, а другое с Name.

interface INumbers {
    [propName: string]: Numbers
}

interface INames {
    [propName: string]: Names
}

Я знаю эта подпись индекса используется в случаях, когда имя свойства неизвестно. Он также указывает, что может быть более одного свойства. Я пытаюсь выяснить, возможно ли объединить INumbers и INames вместе.

Я пробовал типы объединения, но тогда объект, реализующий этот интерфейс, может иметь только 1 свойство. Другая идея по расширению интерфейсов тоже не сработала.

interface IPayload {
    [propName: string]: INumbers | INames
}

// this will use `[propName: string]` from 1st extended interface, ignoring others
interface IPayload extends INumbers, INames {}

Интересно, возможно ли это вообще? Буду признателен за любую помощь.

Спасибо!

1 Ответ

0 голосов
/ 01 августа 2020
type NumberListType = Number[];
type NameType = string;

type NumberKeyType = "numbers" | "numeros";
type NameKeyType = "name" | "nombre";

type INumbers = {
  [propName in NumberKeyType]: NumberListType;
};

type INames = {
  [propName in NameKeyType]: NameType;
};

interface IPayload extends Partial<INames>, Partial<INumbers> {}

const pay: IPayload = {
  numeros: [1, 2],
  name: "",
  // numbers: "", Error
  // nombre: [1, 2], Error
};

пробую, правильно хочешь? Спасибо.

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