Как преобразовать keyof экспорта в строковый тип - PullRequest
1 голос
/ 07 марта 2020

У меня есть это:

export const USER_SETTINGS_UPDATED = 'c_USER_SETTINGS_UPDATED';
export const GET_USER = 'c_GET_USER';
export const EMAIL_RECORDS_RECEIVED = 'c_EMAIL_RECORDS_RECEIVED';

export type UserConstants = keyof typeof exports;

проблема в том, что UserConstants не строка, а вместо string | number | symbol ... есть ли способ привести UserConstants к строковому типу, или еще лучше, получить значения вместо ключей?

ЦЕЛЬ: Я ищу тип, который выглядит следующим образом:

type UserConstants = 'c_USER_SETTINGS_UPDATED' | 'c_GET_USER' | 'c_EMAIL_RECORDS_RECEIVED'

Я пробовал это:

type ValueOf<T> = T[keyof T];
export type UserConstants = ValueOf<typeof exports>;

но это просто дает:

type UserConstants = string

Ответы [ 2 ]

2 голосов
/ 07 марта 2020

Вы можете сделать это путем динамического импорта исходного файла с помощью import().

Например: Детская площадка

export const USER_SETTINGS_UPDATED = 'c_USER_SETTINGS_UPDATED';
export const GET_USER = 'c_GET_USER';
export const EMAIL_RECORDS_RECEIVED = 'c_EMAIL_RECORDS_RECEIVED';

export type UserConstants = typeof import('./input')[keyof typeof import('./input')];

Вам не нужен дополнительный объект как предполагает Крис.

2 голосов
/ 07 марта 2020

typeof exports равно any, поэтому keyof typeof exports равно symbol | string | symbol.

Вы можете объявить объект с вашими константами, экспортировать его в качестве значения по умолчанию и дополнительно экспортировать тип. Это должно получить вам то, что вы хотите. Каждая отдельная константа импортируется, как и тип UserConstants.

const constants = {
  USER_SETTINGS_UPDATED: 'c_USER_SETTINGS_UPDATED',
  GET_USER: 'c_GET_USER',
  EMAIL_RECORDS_RECEIVED: 'c_EMAIL_RECORDS_RECEIVED',
}

export type UserConstants = keyof typeof constants;
export default constants;
...