Typescript-transpilerad Javascript inkluderar inte egenskaper
Mitt transpilerade Javascript för mina klientmodeller inkluderar inte egenskaperna från Typescript-filerna.
Dessa egenskaper sätts aldrig direkt eftersom de analyseras och mappas från JSON, så jag trodde kanske att kompilatorn var smart och optimerade koden för att ta bort oanvända egenskaper, men jag ser inga alternativ för att stänga av ett sådant beteende, så kanske något annat.
En av mina modeller som ett exempel:
RfidData.ts
import { TimeModel } from "./Model";
export class RfidData extends TimeModel {
DeviceId: string;
Transponders: string[];
}
RfidData.js (kompilerad utdata)
"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
Som du kan se kommer de två egenskaperna DeviceId och Transponders inte med i den transpilerade utdata.
.tsconfig (för referens)
{
"compileOnSave": true,
"compilerOptions": {
"noImplicitAny": false,
"noEmitOnError": true,
"removeComments": false,
"sourceMap": true,
"moduleResolution": "node",
"module": "commonjs",
"target": "es6",
"outDir": "Client/js/"
},
"exclude": [
"node_modules",
"wwwroot"
]
}
All hjälp skulle uppskattas mycket.
UPPDATERING -- Ytterligare diskussion
Efter en bra diskussion finns det ett annat problem här, nämligen att typer tas bort efter att ha transpilerats, typborttagning som jcalz påpekar. Så att mappa JSON med ett gränssnitt eller sätta egenskaperna manuellt löser inte problemet om du har typade egenskaper. Till exempel lämnas ett Date som any i en underliggande klass, så du kan inte komma åt några relevanta egenskaper, det lämnas som en sträng i JS.
Finns det något sätt att behålla typer i ES6 transpilerat från TypeScript? Annars var denna fråga ganska akademisk. :(
Svar #1
TypeScript raderar all typinformation när det transpileras till JavaScript. I ditt fall sätter inte egenskapsdeklarationerna några värden, så de tas också bort. Jag är inte säker på varför du vill se dem vid körning om du inte sätter deras värden, men du har förmodligen dina skäl.
Om du verkligen vill se egenskaperna i JavaScript, då kan du initiera dem till värden:
export class RfidData extends TimeModel {
DeviceId: string = "";
Transponders: string[] = [];
}
transpiler till
class RfidData extends Model_1.TimeModel {
constructor() {
this.DeviceId = "";
this.Transponders = [];
}
}
Om du inte kan komma på rimliga initialvärden kan du sätta dem till undefined eller void 0 (och om du har --strictNullChecks på måste du använda undefined! eller liknande).
Hoppas det hjälper; lycka till!
