0

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

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. 定义常量字符串值的联合类型

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

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

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

4

2 回答 2

2

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

它将在 2.4 中可用。

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

于 2017-05-20T00:09:56.903 回答
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;
于 2017-12-05T17:34:20.427 回答