Можно ли сделать обобщенный c сопоставленный тип объекта в TypeScript? - PullRequest
1 голос
/ 29 марта 2020

У меня есть две похожие группы определений машинописи:

enum Operation1 {
  eof = 'eof',
  bof = 'bof'
}
type OperationConfig1 = { [key in Operation1]: TestBedConfig };

enum Operation2 {
  append = 'append',
  prepend = 'prepend'
}
type OperationConfig2 = { [key in Operation2]: TestBedConfig };

Я могу использовать их следующим образом:

const config1: OperationConfig1 = {
  [Operation1.eof]: { ... },
  [Operation1.bof]: { ... }
};

const config2: OperationConfig2 = {
  [Operation2.append]: { ... },
  [Operation2.prepend]: { ... }
};

Я хочу заменить OperationConfig1 и OperationConfig2 одним generi c type OperationConfig принимает Operation в качестве параметра в некоторой форме, такой как

type OperationConfigGeneric<T> = { [key in T]: TestBedConfig };

const config1: OperationConfigGeneric<Operation1> = { ... };
const config2: OperationConfigGeneric<Operation2> = { ... };

Приведенный выше код недействителен и выдает следующее исключение:

TS2322: Type 'T' нельзя назначить типу 'string | номер |
символ '. Тип 'T' нельзя назначить типу 'symbol'.

Вопрос. Как параметризовать тип сопоставленного объекта (OperationConfigGeneri c)? Или есть какая-нибудь удобная альтернатива?

1 Ответ

1 голос
/ 29 марта 2020

Вы можете сделать это, но это возможно только тогда, когда параметр типа T является чем-то, что может быть ключом свойства. Итак, если вы объявляете T с PropertyKey в качестве верхней границы, это работает.

type OperationConfigGeneric<T extends PropertyKey> = {
    [key in T]: TestBedConfig
};

const config1: OperationConfigGeneric<Operation1> = { ... };
...