无法找到同一文件中定义的名称;如何实现 union 类型的 const 值?

Cannot find name defined in same file; How to achieve union type of const values?

我导出了一些字符串常量并尝试将它们用于同一文件中的类型定义,但它不起作用。

export const SET_DETERMINATION = 'SET_DETERMINATION';
export const SET_HIGHLIGHTING = 'SET_HIGHLIGHTING';
export const SET_TEXT = 'SET_TEXT';

export type THypoAction =
  SET_DETERMINATION
  | SET_HIGHLIGHTING
  | SET_TEXT;

TS2304: Cannot find name 'SET_DETERMINATION'.

TS2304: Cannot find name 'SET_HIGHLIGHTING'.

TS2304: Cannot find name 'SET_TEXT'.

我可以通过使用字符串值本身定义我的类型来解决这个问题,即

export type THypoAction =
  'SET_DETERMINATION'
  | 'SET_HIGHLIGHTING'
  | 'SET_TEXT';

但这似乎比引用常量更脆弱。

有什么方法可以实现以下目标吗?

  1. 仅声明一次文字字符串值
  2. 导出常量及其字符串值
  3. 定义常量字符串值的联合类型

对于上下文,我希望构建一个 reducer,它将接受遵循如下接口的分派操作(仅具有更具体的有效负载)

export interface IHypoAction {
  type: THypoAction;
  payload?: any;
}

在引用它的模块中,我因此需要常量及其接口的类型定义。

这就是您要查找的内容:https://github.com/Microsoft/TypeScript/pull/15486

它将在 2.4 中可用。

你遇到的问题是 const X 是一个值,而不是一个类型。因此你不能在接受类型的 type THypoAction = ... 中使用它。

@unional 我正在使用 ts 2.6.1,但它不起作用。在下面的代码示例中,ts 无法找到名称 'SET_TOKEN',但如果我将其作为字符串 readonly type: 'SET_TOKEN';:

括起来,则此问题已修复
import { Action } from '@ngrx/store';

export const SIGNUP = 'SIGNUP';
export const SIGNIN = 'SIGNIN';
export const LOGOUT = 'LOGOUT';
export const SET_TOKEN = 'SET_TOKEN';

/* Some other classes here */

export class SetToken implements Action {
    readonly type: SET_TOKEN; // ts error here. ts cannot find name
    constructor(public payload: string) { }
}

export type AuthActions =
    SignUp |
    SignIn |
    LogOut |
    SetToken;