TypeScript подписи типа подписи - PullRequest
2 голосов
/ 29 апреля 2020

Я довольно новичок в TypeScript, и мне нужно объявить тип как:

type U = { [key: string]: number }; // any string for the keys
type T = { [key: string]: U };      // same

Пример использования:

const test: T = {
    'aaa': {
        'xxx': 777,
        'yyy': 888,
        'zzz': 999  // error expected
    },
    'bbb': {
        'xxx': 444,
        'yyy': 555,
        'ooo': 666  // error expected
    }
};

Есть ли способ, лучше и, вероятно, более сложная подпись, чтобы гарантировать, что все свойства U в T будут иметь одинаковые ключи?

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Определите U с нужными вам свойствами бетона, и вы получите желаемое поведение:

type U = {
    "xxx": number,
    "yyy": number;
    "zzz": number;
}
type T = { [key: string]: U }

Таким образом вы получите ошибку на ooo:

const test: T = {
    'aaa': {
        'xxx': 777,
        'yyy': 888,
        'zzz': 999
    },
    'bbb': {
        'xxx': 444,
        'yyy': 555,
        'ooo': 666  // error expected here
    }
};

Есть игровая площадка ссылка с полным примером.

1 голос
/ 29 апреля 2020

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

interface U { 
  [key: string]: number;
  xxx: number;
  yyy: number;
  zzz: number; 
}; 

если вы просто хотите, чтобы два объекта требовали иметь те же ключи, вы могли бы сделать что-то с обобщениями

interface BaseType<T> {
  xxx: T;
  yyy: T;
  zzz: T; 
}

type U = BaseType<number>;
type T = BaseType<U>;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...