找不到同一文件中定义的名称;如何实现const值的联合类型?

时间:2017-05-19 23:09:22

标签: typescript ngrx ngrx-store

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

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:找不到名称'SET_DETERMINATION'。

     

TS2304:找不到名称'SET_HIGHLIGHTING'。

     

TS2304:找不到名称'SET_TEXT'。

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

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

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

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

  1. 仅声明文字字符串值
  2. 使用字符串值
  3. 导出常量
  4. 定义常量字符串值的联合类型
  5. 对于上下文,我希望构建一个reducer,它将接受遵循以下接口的调度操作(仅使用更具体的有效负载)

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

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

2 个答案:

答案 0 :(得分:2)

您正在寻找:https://github.com/Microsoft/TypeScript/pull/15486

将在2.4中提供。

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

答案 1 :(得分:0)

@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;