Как правильно ввести значения перечисления, сопоставленные с ключом - PullRequest
0 голосов
/ 07 июня 2019

Я пытался сделать эти две функции, чтобы получить ключи и значения перечислений. Кажется, они работают, и я выяснил большинство набора текста, осталась всего одна ошибка, что я надеялся, что кто-то умнее, чем я в TypeScript, может помочь с ...

const isInteger = /^\d+$/;

export const enumKeys = <T>(enumObj: T): string[] => {
  return Object.keys(enumObj).filter(k => !isInteger.test(k));
};

export const enumValues = <T>(enumObj: T): T[keyof T][] => {
  return enumKeys(enumObj).map(k => enumObj[k]);
};

Проблема - enumObj[k], которая выдает ошибку этого типа:

Элемент неявно имеет тип 'any', потому что тип '{}' не имеет подписи индекса. TS (7017)

Я знаю, что мог бы просто проигнорировать предупреждение, но я хочу узнать, и я не понимаю, почему / что именно подразумевается здесь any, и как правильно напечатать его, чтобы это не было.


Решение, основанное на принятом ответе

const isInteger = /^\d+$/;

export const enumKeys = <T>(enumObj: T): (keyof T)[] => {
  return Object.keys(enumObj)
    .filter(k => !isInteger.test(k))
    .map(k => k as keyof T);
};

export const enumValues = <T>(enumObj: T): T[keyof T][] => {
  return enumKeys(enumObj).map(k => enumObj[k]);
};

1 Ответ

1 голос
/ 07 июня 2019

Более новые версии TS имеют следующую ошибку

Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'unknown'.
  No index signature with a parameter of type 'string' was found on type 'unknown'.ts(7053)

Параметр типа T не имеет ограничения типа, поэтому по умолчанию его ограничение равно (unknown или {} в зависимости от версии).Когда вы пытаетесь индексировать с помощью enumObj[k], k имеет тип string, но enumObj не поддерживает индексирование с string, так как не имеет подписи индекса, которая принимает string.

Простое решение состоит в том, чтобы утверждать, что k действительно является ключом T:

export const enumKeys = <T>(enumObj: T): string[] => {
  return Object.keys(enumObj).filter(k => !isInteger.test(k));
};

export const enumValues = <T>(enumObj: T): T[keyof T][] => {
  return enumKeys(enumObj).map(k => enumObj[k as keyof T]);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...