使用枚举值作为接口属性名称时,Typescript编译器会生成未使用的变量

时间:2019-01-04 16:13:49

标签: typescript

当在接口中使用枚举作为属性名称时,打字稿编译器(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;

是否有一种方法可以防止在使用属性名称时生成未使用的变量,就像使用属性值一样?

1 个答案:

答案 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;
}

注意 Created an issue for this.