ทำไมการส่งออกอินเทอร์เฟซ, enum หรือชนิดใน TypeScript จึงไม่สร้างโมดูล
ฉันมีไฟล์ TS ดังต่อไปนี้ (enums.ts) ซึ่งฉันพยายามนำเข้าในไฟล์อื่น
export interface ZZZ {
z: number
}
export const enum EnumTest {
T2,
T3,
XY
}
export type EnumTest_Strings = keyof typeof EnumTest;
export function toto(){ }; // commenting this 'removes' the module
ถ้าฉันลบบรรทัดสุดท้ายออก ฉันจะไม่สามารถนำเข้าข้อมูลใดๆ ในไฟล์อื่นได้ มันบอกว่าไม่พบโมดูล "./enums"
มีวิธีใดที่จะสร้างโมดูลโดยไม่ต้องประกาศฟังก์ชันหรือไม่?
คำตอบ #1
สำหรับ const enum
คุณจะต้องการเปิดใช้งาน preserveConstEnums ในไฟล์ tsconfig.json ของคุณ
preserveConstEnums: อย่าลบการประกาศ const enum ในโค้ดที่สร้างขึ้น const enum ให้วิธีการลดขนาดหน่วยความจำโดยรวมของแอปพลิเคชันของคุณในเวลารันไทม์โดยการแสดงค่าของ enum แทนการอ้างอิง
เมื่อเปิดใช้งาน preserveConstEnums รหัส TypeScript นี้:
export interface ZZZ {
z: number
}
export const enum EnumTest {
T2,
T3,
XY
}
export type EnumTest_Strings = keyof typeof EnumTest;
จะส่งผลให้เกิดรหัสจาวาสคริปต์นี้:
export var EnumTest;
(function (EnumTest) {
EnumTest[EnumTest["T2"] = 0] = "T2";
EnumTest[EnumTest["T3"] = 1] = "T3";
EnumTest[EnumTest["XY"] = 2] = "XY";
})(EnumTest || (EnumTest = {}));
สนามเด็กเล่น
สำหรับ enum ปกติ
อีกทางหนึ่ง คุณสามารถใช้ enum ปกติแทน const enum ได้
ด้วย enum ปกติ โค้ด TypeScript นี้:
export interface ZZZ {
z: number
}
export enum EnumTest {
T2,
T3,
XY
}
export type EnumTest_Strings = keyof typeof EnumTest;
จะส่งผลให้เกิดรหัสจาวาสคริปต์นี้:
export var EnumTest;
(function (EnumTest) {
EnumTest[EnumTest["T2"] = 0] = "T2";
EnumTest[EnumTest["T3"] = 1] = "T3";
EnumTest[EnumTest["XY"] = 2] = "XY";
})(EnumTest || (EnumTest = {}));
สนามเด็กเล่น
ความแตกต่างระหว่าง enum และ const enum
ประเภท enum ปกติ คือ:
- ครอบคลุมมากกว่า
const enum:s - คอมไพล์ลงไปเป็นอ็อบเจ็กต์ของจาวาสคริปต์
const enum มีดังนี้:
- เข้มงวดกว่าปกติ
enum - ถูกคอมไพล์ 'ไป' ในระหว่างการทรานสไพล์
ซึ่งหมายความว่า const enum จะไม่สามารถเข้าถึงได้ในระหว่างรันไทม์ (หรือเป็นส่วนหนึ่งของไลบรารี) อย่างไรก็ตาม const enum จะใช้พื้นที่น้อยกว่าในไฟล์จาวาสคริปต์ที่สร้างขึ้น ตัวอย่างเช่น: console.log(EnumTest.XY) จะถูกคอมไพล์เป็น console.log(EnumTest.XY) หาก EnumTest เป็น enum ปกติ หรือจะถูกคอมไพล์เป็น console.log(2 /* XY */) หาก EnumTest เป็น const enum
สนามเด็กเล่น
เกี่ยวกับ interface และ type
นี่เป็นเพียงประเภทเท่านั้น พวกมันจะไม่สามารถเข้าถึงได้หรือเกี่ยวข้องใน JavaScript ปกติในรูปแบบใด ๆ ดังนั้น TypeScript จะไม่รวมพวกมันในผลลัพธ์การสร้างตามค่าเริ่มต้น คุณยังสามารถรวมพวกมันในผลลัพธ์ของคุณในรูปแบบของการประกาศประเภทได้ หากคุณเปิดใช้งาน declaration ใน tsconfig.json ของคุณ สิ่งนี้จะไม่เปลี่ยนพฤติกรรมของโค้ดของคุณในระหว่างการรันไทม์หรือระหว่างการทำงานร่วมกับ JavaScript แต่จะอนุญาตให้ไฟล์ TypeScript อื่น ๆ นำเข้า JavaScript ที่แปลงแล้วของคุณเหมือนกับว่าเป็น TypeScript ปกติ
เมื่อเปิดใช้งาน declaration โค้ด TypeScript นี้:
export interface ZZZ {
z: number
}
export enum EnumTest {
T2,
T3,
XY
}
export type EnumTest_Strings = keyof typeof EnumTest;
จะส่งผลให้เกิดไฟล์ประกาศนี้ (.d.ts) ควบคู่ไปกับไฟล์จาวาสคริปต์ของคุณ:
export interface ZZZ {
z: number;
}
export declare enum EnumTest {
T2 = 0,
T3 = 1,
XY = 2
}
export declare type EnumTest_Strings = keyof typeof EnumTest;
สนามเด็กเล่น
