【问题标题】:How to cast keyof exports to string type如何将导出的 keyof 转换为字符串类型
【发布时间】:2020-03-06 21:58:59
【问题描述】:

我有这个:

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

【问题讨论】:

  • 您是否正在寻找与枚举等效的 TS?

标签: typescript tsc


【解决方案1】:

您可以通过使用import() 动态导入源文件来做到这一点。

例如:Playground

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')];

你不需要像 Chris 暗示的那样额外的对象。

【讨论】:

  • 聪明!我喜欢这种方法。
【解决方案2】:

typeof exportsany,所以 keyof typeof exportssymbol | 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;

【讨论】:

  • 您已经通过默认导出更改了他的导出形状。这不是必需的,而且是一个相当丑陋的解决方案,特别是因为许多人建议不要使用默认导出。
  • 可以改变导出的形状,但是不确定这是否有效,正在测试它
猜你喜欢
  • 1970-01-01
  • 2012-09-19
  • 1970-01-01
  • 2022-08-18
  • 2022-10-02
  • 2019-09-10
  • 1970-01-01
  • 2019-01-21
  • 2016-12-30
相关资源
最近更新 更多