当在接口中使用枚举作为属性名称时,打字稿编译器(tsc版本3.2.2)添加require
语句,而在将其用作属性值时则不添加语句:
假设我在文件中定义了一个枚举:
// props.ts
export enum PROPS {
A = 'PROP_A',
B = 'PROP_B',
}
在第二个文件中,还有一个使用枚举指定属性名称的接口:
// ifce.ts
import { PROPS } from './props';
export interface ISomething {
[PROPS.A]: string;
}
tsc ifce.ts
产生变量props_1
"use strict";
exports.__esModule = true;
// ifce.ts
var props_1 = require("./props");
另一方面,如果将枚举用作属性值:
// ifce.ts
import { PROPS } from './props';
export interface ISomething {
someKey: PROPS;
}
输出不产生任何变量:
// ifce.js
"use strict";
exports.__esModule = true;
是否有一种方法可以防止在使用属性名称时生成未使用的变量,就像使用属性值一样?
答案 0 :(得分:1)
我相信这是一个编译器错误。通常,在不将其用于表达式中而仅将其用于类型时,将忽略导入。 FAQ中对此进行了记录。
例如,由于PROPS.A
仅在类型注释中使用,因此此代码不会发出导入代码
import { PROPS } from './props';
let A : PROPS.A
如果我们在表达式中使用PROPS
枚举,则不会忽略导入,因此例如,此代码将生成用于导入的代码:
import { PROPS } from './props';
let A = PROPS.A
计算的属性有点特殊,因为尽管它们属于类型,但计算的属性名称必须是表达式(具有唯一符号类型的文字类型的简单表达式,但是仍然是表达式),并且相信这是导致(在我看来是错误的)编译器考虑使用的导入的原因。
作为一种解决方法,可以使用间接级别,可以声明枚举成员类型的const
,并在接口声明中使用它。
import { PROPS } from './props';
declare const A: PROPS.A
export interface ISomething {
[A]: string;
}
这将防止编译器发出用于导入的代码,因为PROPS.A
仅在A
的类型注释中使用,然后在接口定义中使用const。而且由于这只是一个接口,因此const在运行时不存在的事实并不重要。
注意,您可以使用该技巧来获取整个枚举:
import { PROPS } from './props';
declare const LOCAL_PROPS: typeof PROPS
export declare interface ISomething {
[LOCAL_PROPS.A]: string;
}