打印的Typescript Javascript不包含属性

时间:2017-12-05 17:24:33

标签: typescript

我为客户端模型编译的Javascript不包含Typescript文件中的属性。

这些属性永远不会直接设置,因为它们是从JSON解析和映射的,所以我想也许编译器很聪明并优化代码以删除未使用的属性但是我没有看到任何选项来关闭这样的行为所以也许别的什么。

我的一个模特作为例子:

RfidData.ts

import { TimeModel } from "./Model";

export class RfidData extends TimeModel {
  DeviceId: string;
  Transponders: string[];
}

RfidData.js(编译输出)

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const Model_1 = require("./Model");
class RfidData extends Model_1.TimeModel {
}
exports.RfidData = RfidData;
//# sourceMappingURL=RfidData.js.map

正如您所看到的,DeviceIdTransponders两个属性不会进入已转换的输出。

.tsconfig(供参考)

{
  "compileOnSave": true,
  "compilerOptions": {
    "noImplicitAny": false,
    "noEmitOnError": true,
    "removeComments": false,
    "sourceMap": true,
    "moduleResolution": "node",
    "module": "commonjs",
    "target": "es6",
    "outDir": "Client/js/"
  },
  "exclude": [
    "node_modules",
    "wwwroot"
  ]
}

非常感谢任何帮助。

更新 - 进一步讨论

经过深入讨论后,还有另一个问题,就是在被转换后剥离类型,jcalz指出类型擦除。因此,如果您有类型属性,那么通过界面映射JSON或手动设置属性并不能解决问题。例如,Date在底层类中保留为任意内容,因此您无法访问任何相关属性,其左侧为JS上的字符串。

无论如何都要从TypeScript中维护ES6中的类型?否则这个问题相当学术化。 :(

1 个答案:

答案 0 :(得分:2)

TypeScript erases转换为JavaScript时的所有类型信息。在您的情况下,属性声明不设置任何值,因此它们也会被删除。如果你没有设置它们的值,我不确定为什么你想在运行时看到它们,但你可能有你的理由。

如果您真的想在JavaScript中查看属性,那么您可以initialize them为值:

export class RfidData extends TimeModel {
  DeviceId: string = ""; 
  Transponders: string[] = [];
}

转化为

class RfidData extends Model_1.TimeModel {
    constructor() {
        this.DeviceId = "";
        this.Transponders = [];
    }
}

如果您无法想出合理的初始值,可以将其设置为undefinedvoid 0(如果您有--strictNullChecks,则必须使用undefined!等等。)

希望有所帮助;祝你好运!