ค้นหาเว็บไซต์

ทำไมการส่งออกอินเทอร์เฟซ, 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;

สนามเด็กเล่น

บทความที่เกี่ยวข้อง