Используйте generi c для propName в TypeScript - PullRequest
0 голосов
/ 05 марта 2020

Я могу использовать enum в качестве propName для объектного типа

export enum WeaponClass {
    smallLaser = "smallLaser",
}

export type WeaponType = {
    [propName in WeaponClass]: number
};

const weapons: WeaponType = {
    [WeaponClass.smallLaser]: 1,
};

детская площадка

Можно ли использовать обобщенный c для the propName & передать в перечисление? (Это скинуть ошибки)

export enum WeaponClass {
    smallLaser = "smallLaser",
}

export type WeaponType<T> = {
    [propName in T]: number
};

const weapons: WeaponType<WeaponClass> = {
    [WeaponClass.smallLaser]: 1,
};

детская площадка

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Проблема в том, что сопоставленный тип может выполнять итерацию только над типом, который может быть ключом свойства. И именно это союз - string | number | symbol. Если вы не сузите тип T, машинопись не сможет использовать его в качестве ключа. Это означает, что нам нужно выполнить сужение типов только до подмножества типов, которые можно использовать в качестве ключей свойств.

К счастью, есть тип, который точно соответствует потребности - PropertyKey. Таким образом, все изменение состоит в том, чтобы сказать:

T extends PropertyKey
0 голосов
/ 05 марта 2020

Ошибка, которую он показывает, потому что T может быть любого типа, но ключи имеют ограничения на типы, которые они могут быть Решением этой проблемы было бы наложение условия на тип T для расширения одного из них:

export type WeaponType<T extends (string | number | symbol)> = {
    [propName in T]: number
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...