我正在努力尝试将字符串常量用作区分联合标记类型和运行时值的类型。
index.ts
import * as helper from './helper';
function test() {
const blue = helper.makeBlueColor();
const red = helper.makeRedColor();
}
test();
helper.ts
import './types';
export function makeBlueColor(): BlueColor {
return { type: BLUE_COLOR_TYPE };
}
export function makeRedColor(): RedColor {
return { type: RED_COLOR_TYPE };
}
types.ts
const BLUE_COLOR_TYPE = 'blue';
const RED_COLOR_TYPE = 'red';
type BlueColor = { type: typeof BLUE_COLOR_TYPE; }
type RedColor = { type: typeof RED_COLOR_TYPE; }
我使用ts-node index.ts
运行它并在VS Code和Node中使用相同的TSC版本。在helper.ts
的VS代码中,我可以按住Ctrl键并点击BLUE_COLOR_TYPE
到types.ts
。但是,当我运行代码时,我得到:
return { type: BLUE_COLOR_TYPE };
^
ReferenceError:未定义BLUE_COLOR_TYPE
我明白为什么会出现这种情况,types.ts
不是模块,因此它充当环境类型声明,但不会在编译输出中导出。但是将types.ts
转换为模块意味着我必须按名称导入类型以便在所有文件中使用!当然必须有更好的方法。我想也许constants.ts
export
编辑const
s会是一种方法,但我可以import
types.ts
{}}必须把它变成一个模块。所以它有点循环。
使用我提供的文件,下一步是什么,以便我可以const
types.ts
typeof
作为$
的类型和值?
答案 0 :(得分:1)
您通常会在import语句中指定要使用的类型。
import { RED_COLOR_TYPE, BLUE_COLOR_TYPE } from './types';
您可以通过导出类型模块的成员来使其可用:
export const BLUE_COLOR_TYPE = 'blue';
您可以使用--module
编译器选项将此导入样式编译为您选择的风格。
或者,如果您实际上是自己加载所有脚本,请确保它们都以正确的顺序存在,正确并加载。