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

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

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

1
2
3
4
5
6
7
8
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'.

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

1
2
3
4
export type THypoAction =
  'SET_DETERMINATION'
  | 'SET_HIGHLIGHTING'
  | 'SET_TEXT';

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

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

  • 仅声明一次文字字符串值
  • 导出带有字符串值的常量
  • 定义常量\\'字符串值的联合类型
  • 对于上下文,我希望构建一个reducer,它将接受遵循如下接口的调度操作(仅具有更具体的有效负载)

    1
    2
    3
    4
    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';:

    ,则此问题已修复

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    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;