編譯器選項

"compilerOptions"

JavaScript 支援
  1. allowJs
  2. checkJs
  3. maxNodeModuleJsDepth
編輯器支援
  1. disableSizeLimit
  2. 外掛程式
命令列

    根目錄欄位

    啟動時 TSConfig 中的根目錄選項 - 這些選項與您的 TypeScript 或 JavaScript 專案設定方式有關。

    # 檔案 - files

    指定要包含在程式中的檔案允許清單。如果找不到任何檔案,就會發生錯誤。

    {
    "": [
    "core.ts",
    "sys.ts",
    "types.ts",
    "scanner.ts",
    "parser.ts",
    "utilities.ts",
    "binder.ts",
    "checker.ts",
    "tsc.ts"
    ]
    }

    當您只有少數檔案且不需要使用 glob 來參照多個檔案時,這很有用。如果您需要,請使用 include

    # 延伸 - extends

    extends 的值是一個字串,其中包含要繼承的另一個組態檔的路徑。路徑可以使用 Node.js 風格解析。

    會先載入基本檔的組態,然後由繼承組態檔中的組態覆寫。組態檔中找到的所有相對路徑都將相對於它們所屬的組態檔解析。

    值得注意的是,繼承組態檔中的 filesincludeexclude覆寫基本組態檔中的那些,而且組態檔之間不允許循環。

    目前,唯一從繼承中排除的頂層屬性是 references

    範例

    configs/base.json:

    tsconfig.json:

    {
    "": "./configs/base",
    "": ["main.ts", "supplemental.ts"]
    }

    tsconfig.nostrictnull.json:

    {
    "": "./tsconfig",
    }
    }

    組態檔中找到的相對路徑屬性(未從繼承中排除)將相對於它們所屬的組態檔解析。

    • 預設

      false

    • 已發布

      2.1

    # Include - include

    指定要包含在程式中的檔案名稱或模式陣列。這些檔案名稱會解析為相對於包含 tsconfig.json 檔案的目錄。

    json
    {
    "include": ["src/**/*", "tests/**/*"]
    }

    這將會包含

    . ├── scripts ⨯ │ ├── lint.ts ⨯ │ ├── update_deps.ts ⨯ │ └── utils.ts ⨯ ├── src ✓ │ ├── client ✓ │ │ ├── index.ts ✓ │ │ └── utils.ts ✓ │ ├── server ✓ │ │ └── index.ts ✓ ├── tests ✓ │ ├── app.test.ts ✓ │ ├── utils.ts ✓ │ └── tests.d.ts ✓ ├── package.json ├── tsconfig.json └── yarn.lock

    includeexclude 支援萬用字元,以建立 glob 模式

    • * 符合零個或多個字元(不含目錄分隔符號)
    • ? 符合任何一個字元(不含目錄分隔符號)
    • **/ 符合任何目錄,巢狀到任何層級

    如果模式中的最後路徑區段不包含副檔名或萬用字元,則會將其視為目錄,並包含該目錄中具有支援副檔名的檔案(例如,預設為 .ts.tsx.d.ts,如果將 allowJs 設為 true,則為 .js.jsx)。

    # Exclude - exclude

    指定在解析 include 時應略過的檔案名稱或模式陣列。

    重要exclude 只會變更哪些檔案會因為 include 設定而包含。由 exclude 指定的檔案仍可能因為程式碼中的 import 陳述式、types 包含、/// <reference 指令,或在 files 清單中指定而成為程式碼庫的一部分。

    它並非一種防止檔案包含在程式碼庫中的機制,它只是變更include設定尋找的內容。

    # 參考 - references

    專案參考是一種將 TypeScript 程式結構化成較小區塊的方法。使用專案參考可以大幅改善建置和編輯器互動時間,強制執行元件之間的邏輯分離,並以新的和改良的方式組織您的程式碼。

    您可以在手冊的專案參考區段中閱讀更多有關參考運作方式的資訊

    • 預設

      false

    編譯器選項

    這些選項構成 TypeScript 設定的大宗,且涵蓋語言應如何運作。

    #類型檢查

    # 允許無法到達的程式碼 - allowUnreachableCode

    • undefined(預設)提供建議作為編輯器的警告
    • true 忽略無法到達的程式碼
    • false 引發無法到達的程式碼的編譯器錯誤

    這些警告僅針對由於使用 JavaScript 語法而無法到達的程式碼,例如

    ts
    function fn(n: number) {
    if (n > 5) {
    return true;
    } else {
    return false;
    }
    return true;
    }

    使用 "allowUnreachableCode": false

    ts
    function fn(n: number) {
    if (n > 5) {
    return true;
    } else {
    return false;
    }
    return true;
    Unreachable code detected.7027Unreachable code detected.
    }
    Try

    這不會影響基於型別分析而看似無法到達的程式碼的錯誤。

    # 允許未使用的標籤 - allowUnusedLabels

    • undefined(預設)提供建議作為編輯器的警告
    • true 忽略未使用的標籤
    • false 引發未使用的標籤的編譯器錯誤

    標籤在 JavaScript 中非常罕見,通常表示嘗試寫入物件文字

    ts
    function verifyAge(age: number) {
    // Forgot 'return' statement
    if (age > 18) {
    verified: true;
    Unused label.7028Unused label.
    }
    }
    Try

    # 永遠嚴格 - alwaysStrict

    確保您的檔案以 ECMAScript 嚴格模式進行剖析,並為每個原始檔發出「使用嚴格模式」。

    ECMAScript 嚴格 模式是在 ES5 中引入的,它提供對 JavaScript 引擎執行時間的行為調整,以提升效能,並讓一組錯誤引發例外,而不是默默地忽略它們。

    • 建議
    • 預設

      true 如果 strict;否則為 false

    • 相關
    • 已發布

      2.1

    # 精確的選擇性屬性類型 - exactOptionalPropertyTypes

    啟用 exactOptionalPropertyTypes 後,TypeScript 會套用更嚴格的規則,說明它如何處理具有 ? 前綴的 typeinterfaces 上的屬性。

    例如,此介面宣告有一個屬性,可以是兩個字串之一:『dark』或『light』,或是不應該在物件中。

    ts
    interface UserDefaults {
    // The absence of a value represents 'system'
    colorThemeOverride?: "dark" | "light";
    }

    未啟用此旗標時,你可以設定 `colorThemeOverride` 為三個值:『dark』、『light』和 `undefined`。

    將值設定為 `undefined` 會讓大多數 JavaScript 執行時期檢查的存在失敗,這實際上是錯誤的。然而,這並不完全準確;`colorThemeOverride: undefined` 與未定義 `colorThemeOverride` 不同。例如,`settings` 中的 `"colorThemeOverride"` 會有不同的行為,其中 `undefined` 作為金鑰,與未定義不同。

    exactOptionalPropertyTypes 使 TypeScript 真正強制執行提供為選用屬性的定義

    ts
    const settings = getUserSettings();
    settings.colorThemeOverride = "dark";
    settings.colorThemeOverride = "light";
     
    // But not:
    settings.colorThemeOverride = undefined;
    Type 'undefined' is not assignable to type '"dark" | "light"' with 'exactOptionalPropertyTypes: true'. Consider adding 'undefined' to the type of the target.2412Type 'undefined' is not assignable to type '"dark" | "light"' with 'exactOptionalPropertyTypes: true'. Consider adding 'undefined' to the type of the target.
    Try
    • 建議
    • 已發布

      4.4

    # Switch 中沒有穿透案例 - noFallthroughCasesInSwitch

    回報 switch 陳述式中穿透案例的錯誤。確保 switch 陳述式中的任何非空案例都包含 `break`、`return` 或 `throw`。這表示你不會意外地傳送案例穿透錯誤。

    ts
    const a: number = 6;
     
    switch (a) {
    case 0:
    Fallthrough case in switch.7029Fallthrough case in switch.
    console.log("even");
    case 1:
    console.log("odd");
    break;
    }
    Try

    # 沒有隱含的 Any - noImplicitAny

    在某些沒有類型註解的情況下,當 TypeScript 無法推斷類型時,會將變數的類型設為 `any`。

    這可能會導致錯過一些錯誤,例如

    ts
    function fn(s) {
    // No error?
    console.log(s.subtr(3));
    }
    fn(42);
    Try

    不過,開啟 `noImplicitAny` 後,TypeScript 會在推斷為 `any` 時發出錯誤

    ts
    function fn(s) {
    Parameter 's' implicitly has an 'any' type.7006Parameter 's' implicitly has an 'any' type.
    console.log(s.subtr(3));
    }
    Try
    • 建議
    • 預設

      true 如果 strict;否則為 false

    • 相關

    # 沒有隱含的覆寫 - noImplicitOverride

    使用繼承的類別時,子類別可能會與其覆寫的函式「不同步」,當這些函式在基底類別中重新命名時。

    例如,想像您正在建構音樂專輯同步系統的模型

    ts
    class Album {
    download() {
    // Default behavior
    }
    }
     
    class SharedAlbum extends Album {
    download() {
    // Override to get info from many sources
    }
    }
    Try

    當您新增對機器學習產生的播放清單支援時,您會將 Album 類別重構為改用「設定」函式

    ts
    class Album {
    setup() {
    // Default behavior
    }
    }
     
    class MLAlbum extends Album {
    setup() {
    // Override to get info from algorithm
    }
    }
     
    class SharedAlbum extends Album {
    download() {
    // Override to get info from many sources
    }
    }
    Try

    在這種情況下,TypeScript 沒有提供任何警告,表示 SharedAlbum 上的 download 預期會覆寫基底類別中的函式。

    使用 noImplicitOverride,您可以確保子類別永遠不會不同步,方法是確保覆寫函式的函式包含關鍵字 override

    下列範例啟用了 noImplicitOverride,當 override 遺失時,您可以看到收到的錯誤

    ts
    class Album {
    setup() {}
    }
     
    class MLAlbum extends Album {
    override setup() {}
    }
     
    class SharedAlbum extends Album {
    setup() {}
    This member must have an 'override' modifier because it overrides a member in the base class 'Album'.4114This member must have an 'override' modifier because it overrides a member in the base class 'Album'.
    }
    Try

    # 無隱式傳回 - noImplicitReturns

    啟用時,TypeScript 會檢查函式中的所有程式碼路徑,以確保它們傳回值。

    ts
    function lookupHeadphonesManufacturer(color: "blue" | "black"): string {
    Function lacks ending return statement and return type does not include 'undefined'.2366Function lacks ending return statement and return type does not include 'undefined'.
    if (color === "blue") {
    return "beats";
    } else {
    "bose";
    }
    }
    Try

    # 無隱式 this - noImplicitThis

    對具有隱含「any」類型的「this」表達式提出錯誤。

    例如,下方的類別傳回一個函式,嘗試存取 this.widththis.height,但 getAreaFunction 內部函式中的 this 的內容不是 Rectangle 的執行個體。

    ts
    class Rectangle {
    width: number;
    height: number;
     
    constructor(width: number, height: number) {
    this.width = width;
    this.height = height;
    }
     
    getAreaFunction() {
    return function () {
    return this.width * this.height;
    'this' implicitly has type 'any' because it does not have a type annotation.
    'this' implicitly has type 'any' because it does not have a type annotation.
    2683
    2683
    'this' implicitly has type 'any' because it does not have a type annotation.
    'this' implicitly has type 'any' because it does not have a type annotation.
    };
    }
    }
    Try
    • 建議
    • 預設

      true 如果 strict;否則為 false

    • 相關
    • 已發布

      2.0

    # 無從索引簽章存取屬性 - noPropertyAccessFromIndexSignature

    此設定確保透過「點號」(obj.key) 語法和「索引」(obj["key"]) 存取欄位,以及在類型中宣告屬性的方式之間的一致性。

    沒有這個旗標,TypeScript 會允許您使用點號語法存取未定義的欄位

    ts
    interface GameSettings {
    // Known up-front properties
    speed: "fast" | "medium" | "slow";
    quality: "high" | "low";
     
    // Assume anything unknown to the interface
    // is a string.
    [key: string]: string;
    }
     
    const settings = getSettings();
    settings.speed;
    (property) GameSettings.speed: "fast" | "medium" | "slow"
    settings.quality;
    (property) GameSettings.quality: "high" | "low"
     
    // Unknown key accessors are allowed on
    // this object, and are `string`
    settings.username;
    (index) GameSettings[string]: string
    Try

    開啟旗標會提出錯誤,因為未知欄位使用點號語法,而不是索引語法。

    ts
    const settings = getSettings();
    settings.speed;
    settings.quality;
     
    // This would need to be settings["username"];
    settings.username;
    Property 'username' comes from an index signature, so it must be accessed with ['username'].4111Property 'username' comes from an index signature, so it must be accessed with ['username'].
    (index) GameSettings[string]: string
    Try

    此標記的目標是針對您呼叫語法中的意圖發出訊號,表示您對於這個屬性存在的確定性。

    # 無未檢查索引存取 - noUncheckedIndexedAccess

    TypeScript 有種方式可以透過索引簽章描述具有未知金鑰但已知物件值的物件。

    ts
    interface EnvironmentVars {
    NAME: string;
    OS: string;
     
    // Unknown properties are covered by this index signature.
    [propName: string]: string;
    }
     
    declare const env: EnvironmentVars;
     
    // Declared as existing
    const sysName = env.NAME;
    const os = env.OS;
    const os: string
     
    // Not declared, but because of the index
    // signature, then it is considered a string
    const nodeEnv = env.NODE_ENV;
    const nodeEnv: string
    Try

    開啟 noUncheckedIndexedAccess 會將 undefined 新增至類型中任何未宣告的欄位。

    ts
    declare const env: EnvironmentVars;
     
    // Declared as existing
    const sysName = env.NAME;
    const os = env.OS;
    const os: string
     
    // Not declared, but because of the index
    // signature, then it is considered a string
    const nodeEnv = env.NODE_ENV;
    const nodeEnv: string | undefined
    Try

    # 無未使用的區域變數 - noUnusedLocals

    報告未使用的區域變數錯誤。

    ts
    const createKeyboard = (modelID: number) => {
    const defaultModelID = 23;
    'defaultModelID' is declared but its value is never read.6133'defaultModelID' is declared but its value is never read.
    return { type: "keyboard", modelID };
    };
    Try

    # 無未使用的參數 - noUnusedParameters

    報告函式中未使用的參數錯誤。

    ts
    const createDefaultKeyboard = (modelID: number) => {
    'modelID' is declared but its value is never read.6133'modelID' is declared but its value is never read.
    const defaultModelID = 23;
    return { type: "keyboard", modelID: defaultModelID };
    };
    Try

    # 嚴格 - strict

    strict 標記會啟用廣泛的類型檢查行為,進而產生更強的程式正確性保證。開啟此標記等同於啟用所有嚴格模式系列選項,如下所述。您之後可以視需要關閉個別嚴格模式系列檢查。

    未來版本的 TypeScript 可能會在此標記下引入其他更嚴格的檢查,因此升級 TypeScript 可能會導致程式中出現新的類型錯誤。在適當且可行的情況下,會新增對應的標記來停用該行為。

    # 嚴格繫結呼叫套用 - strictBindCallApply

    設定後,TypeScript 會檢查函式 callbindapply 的內建方法是否以正確的引數呼叫底層函式

    ts
    // With strictBindCallApply on
    function fn(x: string) {
    return parseInt(x);
    }
     
    const n1 = fn.call(undefined, "10");
     
    const n2 = fn.call(undefined, false);
    Argument of type 'boolean' is not assignable to parameter of type 'string'.2345Argument of type 'boolean' is not assignable to parameter of type 'string'.
    Try

    否則,這些函式會接受任何引數並傳回 any

    ts
    // With strictBindCallApply off
    function fn(x: string) {
    return parseInt(x);
    }
     
    // Note: No error; return type is 'any'
    const n = fn.call(undefined, false);
    Try
    • 建議
    • 預設

      true 如果 strict;否則為 false

    • 相關
    • 已發布

      3.2

    # 嚴格函式類型 - strictFunctionTypes

    啟用時,此旗標會導致函式參數接受更正確的檢查。

    以下是關閉 strictFunctionTypes 的基本範例

    ts
    function fn(x: string) {
    console.log("Hello, " + x.toLowerCase());
    }
     
    type StringOrNumberFunc = (ns: string | number) => void;
     
    // Unsafe assignment
    let func: StringOrNumberFunc = fn;
    // Unsafe call - will crash
    func(10);
    Try

    開啟 strictFunctionTypes 後,錯誤會正確偵測到

    ts
    function fn(x: string) {
    console.log("Hello, " + x.toLowerCase());
    }
     
    type StringOrNumberFunc = (ns: string | number) => void;
     
    // Unsafe assignment is prevented
    let func: StringOrNumberFunc = fn;
    Type '(x: string) => void' is not assignable to type 'StringOrNumberFunc'. Types of parameters 'x' and 'ns' are incompatible. Type 'string | number' is not assignable to type 'string'. Type 'number' is not assignable to type 'string'.2322Type '(x: string) => void' is not assignable to type 'StringOrNumberFunc'. Types of parameters 'x' and 'ns' are incompatible. Type 'string | number' is not assignable to type 'string'. Type 'number' is not assignable to type 'string'.
    Try

    在開發此功能期間,我們發現大量本質上不安全的類別階層,包括 DOM 中的一些類別。因此,此設定只套用在以 function 語法撰寫的函式,不套用在以 method 語法撰寫的函式

    ts
    type Methodish = {
    func(x: string | number): void;
    };
     
    function fn(x: string) {
    console.log("Hello, " + x.toLowerCase());
    }
     
    // Ultimately an unsafe assignment, but not detected
    const m: Methodish = {
    func: fn,
    };
    m.func(10);
    Try
    • 建議
    • 預設

      true 如果 strict;否則為 false

    • 相關
    • 已發布

      2.6

    # 嚴格 Null 檢查 - strictNullChecks

    strictNullChecksfalse 時,語言會實際上忽略 nullundefined。這可能會導致執行時期發生意外錯誤。

    strictNullCheckstrue 時,nullundefined 會有各自不同的類型,如果您嘗試在預期具體值的地方使用它們,就會收到類型錯誤。

    例如,使用此 TypeScript 程式碼,users.find 無法保證它實際上會找到使用者,但您可以撰寫程式碼,就像它會找到使用者一樣

    ts
    declare const loggedInUsername: string;
     
    const users = [
    { name: "Oby", age: 12 },
    { name: "Heera", age: 32 },
    ];
     
    const loggedInUser = users.find((u) => u.name === loggedInUsername);
    console.log(loggedInUser.age);
    Try

    strictNullChecks 設定為 true 會產生錯誤,表示您並未保證 loggedInUser 存在,就嘗試使用它。

    ts
    declare const loggedInUsername: string;
     
    const users = [
    { name: "Oby", age: 12 },
    { name: "Heera", age: 32 },
    ];
     
    const loggedInUser = users.find((u) => u.name === loggedInUsername);
    console.log(loggedInUser.age);
    'loggedInUser' is possibly 'undefined'.18048'loggedInUser' is possibly 'undefined'.
    Try

    第二個範例失敗,是因為陣列的 find 函式看起來有點像這個簡化版本

    ts
    // When strictNullChecks: true
    type Array = {
    find(predicate: (value: any, index: number) => boolean): S | undefined;
    };
    // When strictNullChecks: false the undefined is removed from the type system,
    // allowing you to write code which assumes it always found a result
    type Array = {
    find(predicate: (value: any, index: number) => boolean): S;
    };
    • 建議
    • 預設

      true 如果 strict;否則為 false

    • 相關
    • 已發布

      2.0

    # 嚴格屬性初始化 - strictPropertyInitialization

    設為 true 時,TypeScript 會在類別屬性宣告但未在建構函式中設定時產生錯誤。

    ts
    class UserAccount {
    name: string;
    accountType = "user";
     
    email: string;
    Property 'email' has no initializer and is not definitely assigned in the constructor.2564Property 'email' has no initializer and is not definitely assigned in the constructor.
    address: string | undefined;
     
    constructor(name: string) {
    this.name = name;
    // Note that this.email is not set
    }
    }
    Try

    在上述情況中

    • this.name 特別設定。
    • this.accountType 預設設定。
    • this.email 未設定並產生錯誤。
    • this.address 宣告為可能為 undefined,表示它不必設定。
    • 建議
    • 預設

      true 如果 strict;否則為 false

    • 相關
    • 已發布

      2.7

    # 在捕捉變數中使用未知 - useUnknownInCatchVariables

    在 TypeScript 4.0 中,新增支援將捕捉子句中變數的型別從 any 變更為 unknown。允許使用類似下列的程式碼

    ts
    try {
    // ...
    } catch (err) {
    // We have to verify err is an
    // error before using it as one.
    if (err instanceof Error) {
    console.log(err.message);
    }
    }
    Try

    此模式可確保錯誤處理程式碼更全面,因為您無法預先保證擲出的物件錯誤子類別。如果啟用旗標 useUnknownInCatchVariables,則不需要額外的語法 (: unknown) 或 linter 規則來嘗試強制執行此行為。

    • 建議
    • 預設

      true 如果 strict;否則為 false

    • 相關
    • 已發布

      4.4

    #模組

    #允許任意擴充功能 - allowArbitraryExtensions

    在 TypeScript 5.0 中,當匯入路徑以非已知的 JavaScript 或 TypeScript 檔案副檔名結尾時,編譯器會以 {檔案基礎檔名}.d.{副檔名}.ts 的形式尋找該路徑的宣告檔。例如,如果你在一個打包器專案中使用 CSS 載入器,你可能想要為這些樣式表撰寫(或產生)宣告檔

    css
    /* app.css */
    .cookie-banner {
    display: none;
    }
    ts
    // app.d.css.ts
    declare const css: {
    cookieBanner: string;
    };
    export default css;
    ts
    // App.tsx
    import styles from "./app.css";
    styles.cookieBanner; // string

    預設情況下,此匯入會引發錯誤,以讓你了解 TypeScript 不理解此檔案類型,而且你的執行階段可能不支援匯入它。但是,如果你已設定你的執行階段或打包器來處理它,你可以使用新的 --allowArbitraryExtensions 編譯器選項來抑制錯誤。

    請注意,在過去,通常可以透過新增一個名為 app.css.d.ts 而不是 app.d.css.ts 的宣告檔來達到類似的效果 - 不過,這只是透過 Node 的 CommonJS 的 require 解析規則運作的。嚴格來說,前者會被解釋為一個名為 app.css.js 的 JavaScript 檔案的宣告檔。由於相對檔案匯入需要在 Node 的 ESM 支援中包含副檔名,因此 TypeScript 會在 --moduleResolution node16nodenext 下的 ESM 檔案中對我們的範例產生錯誤。

    如需更多資訊,請閱讀 此功能的提案其對應的拉取請求

      # 允許匯入 TS 副檔名 - allowImportingTsExtensions

      --allowImportingTsExtensions 允許 TypeScript 檔案使用 TypeScript 特定的副檔名(例如 .ts.mts.tsx)互相匯入。

      此旗標僅在啟用 --noEmit--emitDeclarationOnly 時才允許,因為這些匯入路徑無法在 JavaScript 輸出檔案中於執行階段解析。此處的預期是你的解析器(例如你的打包器、執行階段或其他工具)將使這些 .ts 檔案之間的匯入運作。

        # 允許 Umd 全域存取 - allowUmdGlobalAccess

        設定為 true 時,allowUmdGlobalAccess 可讓您從模組檔案內部以全域方式存取 UMD 匯出。模組檔案是一個具有匯入和/或匯出的檔案。沒有這個旗標,使用 UMD 模組的匯出需要一個匯入宣告。

        此旗標的一個範例使用案例會是一個網頁專案,您知道特定函式庫(例如 jQuery 或 Lodash)在執行階段總是可用,但您無法透過匯入存取它。

        # 基礎 URL - baseUrl

        設定一個基礎目錄,用於解析裸露的指定符號模組名稱。例如,在目錄結構中

        project ├── ex.ts ├── hello │ └── world.ts └── tsconfig.json

        使用 "baseUrl": "./",TypeScript 會從與 tsconfig.json 相同的資料夾開始尋找檔案

        ts
        import { helloWorld } from "hello/world";
        console.log(helloWorld);

        此解析優先於從 node_modules 的查詢。

        此功能設計為與瀏覽器中的 AMD 模組載入器結合使用,不建議在任何其他情況下使用。從 TypeScript 4.1 開始,使用 paths 時不再需要設定 baseUrl

          # 自訂條件 - customConditions

          --customConditions 會取得一個額外的 條件 清單,這些條件應該在 TypeScript 從 package.jsonexportsimports 欄位解析時成功。這些條件會新增到解析器預設會使用的任何現有條件中。

          例如,當此欄位在 tsconfig.json 中設定為

          jsonc
          {
          "compilerOptions": {
          "target": "es2022",
          "moduleResolution": "bundler",
          "customConditions": ["my-condition"]
          }
          }

          任何時候在 package.json 中參照 exportsimports 欄位,TypeScript 都會考慮稱為 my-condition 的條件。

          因此,當從具有以下 package.json 的套件匯入時

          jsonc
          {
          // ...
          "exports": {
          ".": {
          "my-condition": "./foo.mjs",
          "node": "./bar.mjs",
          "import": "./baz.mjs",
          "require": "./biz.mjs"
          }
          }
          }

          TypeScript 會嘗試尋找對應於 foo.mjs 的檔案。

          此欄位僅在 --moduleResolutionnode16nodenextbundler 選項下有效。

          # 模組 - module

          設定程式碼的模組系統。請參閱 TypeScript 的 module 選項背後理論其參考頁面 以取得更多資訊。對於現代 Node.js 專案,您很可能會需要 "nodenext"

          變更 module 會影響 moduleResolution,其 也有參考頁面

          以下是此檔案的一些範例輸出

          ts
          // @filename: index.ts
          import { valueOfPi } from "./constants";
           
          export const twoPi = valueOfPi * 2;
          Try

          CommonJS

          ts
          "use strict";
          Object.defineProperty(exports, "__esModule", { value: true });
          exports.twoPi = void 0;
          const constants_1 = require("./constants");
          exports.twoPi = constants_1.valueOfPi * 2;
           
          Try

          UMD

          ts
          (function (factory) {
          if (typeof module === "object" && typeof module.exports === "object") {
          var v = factory(require, exports);
          if (v !== undefined) module.exports = v;
          }
          else if (typeof define === "function" && define.amd) {
          define(["require", "exports", "./constants"], factory);
          }
          })(function (require, exports) {
          "use strict";
          Object.defineProperty(exports, "__esModule", { value: true });
          exports.twoPi = void 0;
          const constants_1 = require("./constants");
          exports.twoPi = constants_1.valueOfPi * 2;
          });
           
          Try

          AMD

          ts
          define(["require", "exports", "./constants"], function (require, exports, constants_1) {
          "use strict";
          Object.defineProperty(exports, "__esModule", { value: true });
          exports.twoPi = void 0;
          exports.twoPi = constants_1.valueOfPi * 2;
          });
           
          Try

          System

          ts
          System.register(["./constants"], function (exports_1, context_1) {
          "use strict";
          var constants_1, twoPi;
          var __moduleName = context_1 && context_1.id;
          return {
          setters: [
          function (constants_1_1) {
          constants_1 = constants_1_1;
          }
          ],
          execute: function () {
          exports_1("twoPi", twoPi = constants_1.valueOfPi * 2);
          }
          };
          });
           
          Try

          ESNext

          ts
          import { valueOfPi } from "./constants";
          export const twoPi = valueOfPi * 2;
           
          Try

          ES2015/ES6/ES2020/ES2022

          ts
          import { valueOfPi } from "./constants";
          export const twoPi = valueOfPi * 2;
           
          Try

          除了 ES2015/ES6 的基本功能外,ES2020 還增加了對 動態 importimport.meta 的支援,而 ES2022 則進一步增加了對 頂層 await 的支援。

          node16/nodenext

          從 4.7+ 開始,node16nodenext 模式與 Node 的 原生 ECMAScript 模組支援 整合。發出的 JavaScript 會根據檔案副檔名和最近 package.jsontype 設定的值,使用 CommonJSES2020 輸出。模組解析也以不同的方式運作。您可以在 手冊模組參考 中了解更多資訊。

          None

          ts
          "use strict";
          Object.defineProperty(exports, "__esModule", { value: true });
          exports.twoPi = void 0;
          const constants_1 = require("./constants");
          exports.twoPi = constants_1.valueOfPi * 2;
           
          Try

          # 模組解析 - moduleResolution

          指定模組解析策略

          • 'node16''nodenext' 適用於現代版本的 Node.js。Node.js v12 和更新版本同時支援 ECMAScript 匯入和 CommonJS require,它們使用不同的演算法解析。這些 moduleResolution 值與對應的 module 值結合使用時,會根據 Node.js 是否會在輸出 JavaScript 程式碼中看到 importrequire,為每個解析選擇正確的演算法。

          • 'node10'(以前稱為 'node')適用於早於 v10 的 Node.js 版本,這些版本僅支援 CommonJS require。您可能不需要在現代程式碼中使用 node10

          • 'bundler' 適用於與打包器搭配使用。與 node16nodenext 類似,此模式支援 package.json "imports""exports",但與 Node.js 解析模式不同,bundler 永遠不需要匯入中的相對路徑上的檔案副檔名。

            bundler 不支援解析 require 呼叫。在 TypeScript 檔案中,這表示禁止使用 import mod = require("foo") 語法;在 JavaScript 檔案中,require 呼叫並非錯誤,但只會傳回 any 類型(或宣告為 return 的全域 require 函式的環境宣告)。

          • 在 1.6 發行之前,TypeScript 使用 'classic'。不應使用 classic

          有參考頁面說明 TypeScript 模組解析背後的理論每個選項的詳細資料

          # 模組字尾 - moduleSuffixes

          提供一種方式來覆寫解析模組時要搜尋的預設檔案名稱字尾清單。

          {
          "moduleSuffixes": [".ios", ".native", ""]
          }
          }

          根據上述組態,以下的匯入

          ts
          import * as foo from "./foo";

          TypeScript 會尋找相對檔案 ./foo.ios.ts./foo.native.ts,最後是 ./foo.ts

          請注意 moduleSuffixes 中的空字串 "",這對於 TypeScript 尋找 ./foo.ts 也是必要的。

          此功能對於 React Native 專案很有用,其中每個目標平台可以使用具有不同 moduleSuffixes 的個別 tsconfig.json。

          # 無解析 - noResolve

          預設情況下,TypeScript 會檢查檔案的初始設定以取得 import<reference 指令,並將這些已解析的檔案新增至您的程式中。

          如果設定 noResolve,此程序將不會執行。不過,系統仍會檢查 import 陳述式,以查看它們是否解析為有效的模組,因此您需要確定透過其他方式滿足此需求。

            # 路徑 - paths

            一系列條目,如果設定 baseUrl,會將輸入重新對應至相對於 baseUrl 的查詢位置,否則會重新對應至 tsconfig 檔案本身。pathsmoduleResolution 參考頁面 中有更廣泛的說明。

            paths 讓您宣告 TypeScript 應如何解析 require/import 中的輸入。

            {
            "": {
            "jquery": ["./vendor/jquery/dist/jquery"]
            }
            }
            }

            這會讓您能夠撰寫 import "jquery",並在本地取得所有正確的輸入。

            {
            "": {
            "app/*": ["./src/app/*"],
            "config/*": ["./src/app/_config/*"],
            "environment/*": ["./src/environments/*"],
            "shared/*": ["./src/app/_shared/*"],
            "helpers/*": ["./src/helpers/*"],
            "tests/*": ["./src/tests/*"]
            },
            }

            在這種情況下,您可以讓 TypeScript 檔案解析器支援多個自訂前置詞,以尋找程式碼。

            請注意,此功能不會變更 tsc 發出輸入路徑的方式,因此 paths 應僅用於告知 TypeScript 另一個工具有此對應,並會在執行階段或套件時使用此對應。

              # 解析 JSON 模組 - resolveJsonModule

              允許導入副檔名為 .json 的模組,這是 node 專案的常見做法。這包括根據靜態 JSON 形狀為 import 產生一個型別。

              TypeScript 預設不支援解析 JSON 檔案

              ts
              // @filename: settings.json
              Cannot find module './settings.json'. Consider using '--resolveJsonModule' to import module with '.json' extension.2732Cannot find module './settings.json'. Consider using '--resolveJsonModule' to import module with '.json' extension.
              {
              "repo": "TypeScript",
              "dry": false,
              "debug": false
              }
              // @filename: index.ts
              import settings from "./settings.json";
               
              settings.debug === true;
              settings.dry === 2;
              Try

              啟用此選項允許導入 JSON,並驗證該 JSON 檔案中的型別。

              ts
              // @filename: settings.json
              {
              "repo": "TypeScript",
              "dry": false,
              This comparison appears to be unintentional because the types 'boolean' and 'number' have no overlap.2367This comparison appears to be unintentional because the types 'boolean' and 'number' have no overlap.
              "debug": false
              }
              // @filename: index.ts
              import settings from "./settings.json";
               
              settings.debug === true;
              settings.dry === 2;
              Try

                # 解析 package.json 匯出 - resolvePackageJsonExports

                --resolvePackageJsonExports 強制 TypeScript 查詢 package.json 檔案的 exports 欄位,如果它曾經從 node_modules 中的套件讀取。

                此選項在 --moduleResolutionnode16nodenextbundler 選項下預設為 true

                # 解析 package.json 匯入 - resolvePackageJsonImports

                --resolvePackageJsonImports 強制 TypeScript 查詢 package.json 檔案的 imports 欄位,當從一個祖先目錄包含 package.json 的檔案開始執行以 # 開頭的查詢時。

                此選項在 --moduleResolutionnode16nodenextbundler 選項下預設為 true

                # 根目錄 - rootDir

                預設值:所有非宣告輸入檔案的最長共用路徑。如果設定 composite,預設值改為包含 tsconfig.json 檔案的目錄。

                當 TypeScript 編譯檔案時,它會在輸出目錄中保留與輸入目錄相同的目錄結構。

                例如,假設您有一些輸入檔案

                MyProj ├── tsconfig.json ├── core │ ├── a.ts │ ├── b.ts │ ├── sub │ │ ├── c.ts ├── types.d.ts

                rootDir 的推論值是所有非宣告輸入檔案的最長共用路徑,在本例中為 core/

                如果您的 outDirdist,TypeScript 會寫入這個樹狀結構

                MyProj ├── dist │ ├── a.js │ ├── b.js │ ├── sub │ │ ├── c.js

                不過,您可能希望 core 成為輸出目錄結構的一部分。透過在 tsconfig.json 中設定 rootDir: ".",TypeScript 會寫入這個樹狀結構

                MyProj ├── dist │ ├── core │ │ ├── a.js │ │ ├── b.js │ │ ├── sub │ │ │ ├── c.js

                重要的是,rootDir 不會影響哪些檔案會成為編譯的一部分。它不會與 includeexcludefiles tsconfig.json 設定互動。

                請注意,TypeScript 永遠不會將輸出檔案寫入 outDir 外的目錄,而且永遠不會略過發射檔案。因此,rootDir 也會強制執行所有需要發射的檔案都位於 rootDir 路徑下方。

                例如,假設您有這個樹狀結構

                MyProj ├── tsconfig.json ├── core │ ├── a.ts │ ├── b.ts ├── helpers.ts

                指定 rootDircore include* 會是一個錯誤,因為它會建立一個檔案 (helpers.ts),而這個檔案需要發射到 outDir 外部 (即 ../helpers.js)。

                • 預設

                  從輸入檔案清單中計算。

                • 已發布

                  1.5

                # 根目錄 - rootDirs

                使用 rootDirs,您可以告知編譯器有很多「虛擬」目錄作為單一根目錄。這允許編譯器在這些「虛擬」目錄中解析相對模組匯入,就像它們已合併到一個目錄中一樣。

                例如

                src └── views └── view1.ts (can import "./template1", "./view2`) └── view2.ts (can import "./template1", "./view1`) generated └── templates └── views └── template1.ts (can import "./view1", "./view2")
                {
                "": ["src/views", "generated/templates/views"]
                }
                }

                這不會影響 TypeScript 發射 JavaScript 的方式,它只模擬在執行時它們將能夠透過這些相對路徑運作的假設。

                rootDirs 可用來為非 TypeScript 或 JavaScript 的檔案提供一個獨立的「類型層」,方法是為另一個資料夾中的已產生 .d.ts 檔案提供一個家。此技術對於您使用 import 匯入不一定是程式碼的檔案的套件應用程式很有用

                sh
                src
                └── index.ts
                └── css
                └── main.css
                └── navigation.css
                generated
                └── css
                └── main.css.d.ts
                └── navigation.css.d.ts
                {
                "": ["src", "generated"]
                }
                }

                此技術讓您可以為非程式碼原始檔預先產生類型。然後,匯入會根據原始檔的位置自然運作。例如,./src/index.ts 可以匯入檔案 ./src/css/main.css,而 TypeScript 會透過對應的已產生宣告檔來了解套件管理員對該檔案類型的行為。

                ts
                // @filename: index.ts
                import { appClass } from "./main.css";
                Try
                • 預設

                  從輸入檔案清單中計算。

                • 已發布

                  2.0

                # 類型根目錄 - typeRoots

                預設情況下,所有可見@types」套件都會包含在您的編譯中。任何封閉資料夾的 node_modules/@types 中的套件都被視為可見。例如,這表示 ./node_modules/@types/../node_modules/@types/../../node_modules/@types/ 等中的套件。

                如果指定了 typeRoots,則只有 typeRoots 下的套件會包含在內。例如

                {
                "": ["./typings", "./vendor/types"]
                }
                }

                此組態檔將包含 ./typings./vendor/types 下的所有套件,以及 ./node_modules/@types 中的套件。所有路徑都相對於 tsconfig.json

                # 類型 - types

                預設情況下,所有可見@types」套件都會包含在您的編譯中。任何封閉資料夾的 node_modules/@types 中的套件都被視為可見。例如,這表示 ./node_modules/@types/../node_modules/@types/../../node_modules/@types/ 等中的套件。

                如果指定了 types,則只有列出的套件會包含在全域範圍內。例如

                {
                "": ["node", "jest", "express"]
                }
                }

                tsconfig.json只會包含 ./node_modules/@types/node./node_modules/@types/jest./node_modules/@types/expressnode_modules/@types/* 下的其他套件不會包含在內。

                這會影響什麼?

                此選項不會影響 @types/* 在應用程式程式碼中的包含方式,例如,如果您有上述的 compilerOptions 範例,其程式碼如下

                ts
                import * as moment from "moment";
                moment().format("MMMM Do YYYY, h:mm:ss a");

                moment 匯入將會完全鍵入。

                當您設定此選項時,不包含 types 陣列中的模組,它

                • 不會將全域變數新增至您的專案(例如,節點中的 process 或 Jest 中的 expect
                • 不會讓匯出顯示為自動匯入建議

                此功能與 typeRoots 不同,在於它只會指定您要包含的確切類型,而 typeRoots 支援表示您想要特定資料夾。

                #發射

                # 宣告 - declaration

                為專案中的每個 TypeScript 或 JavaScript 檔案產生 .d.ts 檔案。這些 .d.ts 檔案是類型定義檔案,用於描述模組的外部 API。透過 .d.ts 檔案,例如 TypeScript 等工具可以為未鍵入的程式碼提供 IntelliSense 和精確的類型。

                declaration 設為 true 時,使用此 TypeScript 程式碼執行編譯器

                ts
                export let helloWorld = "hi";
                Try

                將產生一個類似以下的 index.js 檔案

                ts
                export let helloWorld = "hi";
                 
                Try

                並有一個對應的 helloWorld.d.ts

                ts
                export declare let helloWorld: string;
                 
                Try

                當使用 .d.ts 檔案搭配 JavaScript 檔案時,您可能想要使用 emitDeclarationOnly 或使用 outDir 來確保 JavaScript 檔案不會被覆寫。

                # 宣告目錄 - declarationDir

                提供一種方式來設定宣告檔案發布的根目錄。

                example ├── index.ts ├── package.json └── tsconfig.json

                使用這個 tsconfig.json

                {
                "": true,
                "": "./types"
                }
                }

                會將 index.ts 的 d.ts 放置在 types 資料夾中

                example ├── index.js ├── index.ts ├── package.json ├── tsconfig.json └── types └── index.d.ts

                # 宣告對應 - declarationMap

                .d.ts 檔案產生一個原始碼對應,用於對應回原始的 .ts 原始碼檔案。這將允許像 VS Code 這樣的編輯器在使用像「轉到定義」等功能時,轉到原始的 .ts 檔案。

                如果您正在使用專案參考,您應該強烈考慮啟用這個選項。

                # 降級迭代 - downlevelIteration

                降級是 TypeScript 將較新版本的 JavaScript 轉譯為較舊版本的 JavaScript 的術語。這個旗標是用於啟用對在較舊 JavaScript 執行時期中,現代 JavaScript 如何迭代新概念的更準確實作支援。

                ECMAScript 6 新增了幾個新的迭代原語:for / of 迴圈 (for (el of arr))、陣列展開 ([a, ...b])、參數展開 (fn(...args)) 和 Symbol.iterator。如果存在 Symbol.iterator 實作,downlevelIteration 允許在 ES5 環境中更準確地使用這些迭代原語。

                範例:對 for / of 的影響

                使用此 TypeScript 程式碼

                ts
                const str = "Hello!";
                for (const s of str) {
                console.log(s);
                }
                Try

                未啟用 downlevelIteration 時,對任何物件的 for / of 迴圈都會降級為傳統的 for 迴圈

                ts
                "use strict";
                var str = "Hello!";
                for (var _i = 0, str_1 = str; _i < str_1.length; _i++) {
                var s = str_1[_i];
                console.log(s);
                }
                 
                Try

                這通常是人們的預期,但它並未 100% 符合 ECMAScript 迭代協定。某些字串,例如表情符號 (😜),其 .length 為 2(甚至更多!),但在 for-of 迴圈中應迭代為 1 個單位。請參閱 Jonathan New 的這篇部落格文章,以取得更詳細的說明。

                啟用 downlevelIteration 時,TypeScript 將使用輔助函式來檢查 Symbol.iterator 實作(原生或多重載入)。如果缺少此實作,您將會降回至基於索引的迭代。

                ts
                "use strict";
                var __values = (this && this.__values) || function(o) {
                var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
                if (m) return m.call(o);
                if (o && typeof o.length === "number") return {
                next: function () {
                if (o && i >= o.length) o = void 0;
                return { value: o && o[i++], done: !o };
                }
                };
                throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
                };
                var e_1, _a;
                var str = "Hello!";
                try {
                for (var str_1 = __values(str), str_1_1 = str_1.next(); !str_1_1.done; str_1_1 = str_1.next()) {
                var s = str_1_1.value;
                console.log(s);
                }
                }
                catch (e_1_1) { e_1 = { error: e_1_1 }; }
                finally {
                try {
                if (str_1_1 && !str_1_1.done && (_a = str_1.return)) _a.call(str_1);
                }
                finally { if (e_1) throw e_1.error; }
                }
                 
                Try

                您可以透過 importHelpers 使用 tslib 來減少內嵌 JavaScript 的數量

                ts
                "use strict";
                var __values = (this && this.__values) || function(o) {
                var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
                if (m) return m.call(o);
                if (o && typeof o.length === "number") return {
                next: function () {
                if (o && i >= o.length) o = void 0;
                return { value: o && o[i++], done: !o };
                }
                };
                throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
                };
                var e_1, _a;
                var str = "Hello!";
                try {
                for (var str_1 = __values(str), str_1_1 = str_1.next(); !str_1_1.done; str_1_1 = str_1.next()) {
                var s = str_1_1.value;
                console.log(s);
                }
                }
                catch (e_1_1) { e_1 = { error: e_1_1 }; }
                finally {
                try {
                if (str_1_1 && !str_1_1.done && (_a = str_1.return)) _a.call(str_1);
                }
                finally { if (e_1) throw e_1.error; }
                }
                 
                Try

                注意:如果執行時期中不存在 Symbol.iterator,啟用 downlevelIteration 並不會改善相容性。

                範例:陣列散佈的影響

                這是一個陣列散佈

                js
                // Make a new array whose elements are 1 followed by the elements of arr2
                const arr = [1, ...arr2];

                根據說明,它聽起來很輕易就能降級到 ES5

                js
                // The same, right?
                const arr = [1].concat(arr2);

                然而,這在某些罕見的情況下,觀察到的結果是不同的。

                例如,如果來源陣列缺少一或多個項目(包含一個空洞),散佈語法會將每個空項目替換為 undefined,而 .concat 會將它們保留原樣。

                js
                // Make an array where the element at index 1 is missing
                let arrayWithHole = ["a", , "c"];
                let spread = [...arrayWithHole];
                let concatenated = [].concat(arrayWithHole);
                console.log(arrayWithHole);
                // [ 'a', <1 empty item>, 'c' ]
                console.log(spread);
                // [ 'a', undefined, 'c' ]
                console.log(concatenated);
                // [ 'a', <1 empty item>, 'c' ]

                就像 for / of 一樣,downlevelIteration 會使用 Symbol.iterator(如果存在)來更精確地模擬 ES 6 行為。

                #發出 BOM - emitBOM

                控制 TypeScript 在寫入輸出檔案時是否會發出 位元組順序標記 (BOM)。有些執行時間環境需要 BOM 來正確地詮釋 JavaScript 檔案;其他環境則需要它不存在。false 的預設值通常是最棒的,除非你有理由要變更它。

                  #僅發出宣告 - emitDeclarationOnly

                  發出 .d.ts 檔案;不要發出 .js 檔案。

                  此設定在兩種情況下很有用

                  • 你正在使用 TypeScript 以外的轉譯器來產生你的 JavaScript。
                  • 你正在使用 TypeScript 來只為你的使用者產生 d.ts 檔案。

                  # 匯入 Helper - importHelpers

                  對於某些降級作業,TypeScript 使用一些 Helper 程式碼進行作業,例如延伸類別、散布陣列或物件,以及非同步作業。預設情況下,這些 Helper 會插入到使用它們的檔案中。如果在許多不同的模組中使用相同的 Helper,這可能會導致程式碼重複。

                  如果 importHelpers 旗標開啟,這些 Helper 函式會從 tslib 模組匯入。您需要確保可以在執行階段匯入 tslib 模組。這只會影響模組;全域指令碼檔案不會嘗試匯入模組。

                  例如,使用這個 TypeScript

                  ts
                  export function fn(arr: number[]) {
                  const arr2 = [1, ...arr];
                  }

                  開啟 downlevelIteration,而 importHelpers 仍然為 false

                  ts
                  var __read = (this && this.__read) || function (o, n) {
                  var m = typeof Symbol === "function" && o[Symbol.iterator];
                  if (!m) return o;
                  var i = m.call(o), r, ar = [], e;
                  try {
                  while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
                  }
                  catch (error) { e = { error: error }; }
                  finally {
                  try {
                  if (r && !r.done && (m = i["return"])) m.call(i);
                  }
                  finally { if (e) throw e.error; }
                  }
                  return ar;
                  };
                  var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
                  if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
                  if (ar || !(i in from)) {
                  if (!ar) ar = Array.prototype.slice.call(from, 0, i);
                  ar[i] = from[i];
                  }
                  }
                  return to.concat(ar || Array.prototype.slice.call(from));
                  };
                  export function fn(arr) {
                  var arr2 = __spreadArray([1], __read(arr), false);
                  }
                   
                  Try

                  然後同時開啟 downlevelIterationimportHelpers

                  ts
                  import { __read, __spreadArray } from "tslib";
                  export function fn(arr) {
                  var arr2 = __spreadArray([1], __read(arr), false);
                  }
                   
                  Try

                  當您提供這些函式的自訂實作時,可以使用 noEmitHelpers

                  # 未作為值使用的匯入 - importsNotUsedAsValues

                  已棄用,建議使用 verbatimModuleSyntax

                  此旗標控制 import 的運作方式,有 3 個不同的選項

                  • remove:僅參考型別的 import 陳述式的預設行為是移除。

                  • preserve:保留所有值或型別從未使用的 import 陳述式。這可能會導致保留匯入/副作用。

                  • 錯誤:這會保留所有匯入(與保留選項相同),但當值匯入僅用作類型時會產生錯誤。如果您想要確保沒有意外匯入任何值,但仍使副作用匯入明確,這可能會很有用。

                  此標記運作是因為您可以使用 import type 明確建立 import 陳述式,該陳述式不應發射到 JavaScript 中。

                  # 內嵌來源地圖 - inlineSourceMap

                  設定後,TypeScript 會將來源地圖內容嵌入到 .js 檔案中,而不是寫出 .js.map 檔案來提供來源地圖。雖然這會導致較大的 JS 檔案,但在某些情況下可能會很方便。例如,您可能想要在不允許提供 .map 檔案的網路伺服器上偵錯 JS 檔案。

                  sourceMap 互斥。

                  例如,使用這個 TypeScript

                  ts
                  const helloWorld = "hi";
                  console.log(helloWorld);

                  轉換成此 JavaScript

                  ts
                  "use strict";
                  const helloWorld = "hi";
                  console.log(helloWorld);
                   
                  Try

                  然後啟用使用 inlineSourceMap 進行建置,檔案底部會有一個註解,其中包含該檔案的來源地圖。

                  ts
                  "use strict";
                  const helloWorld = "hi";
                  console.log(helloWorld);
                  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDO0FBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMifQ==
                  Try

                  # 內嵌來源 - inlineSources

                  設定後,TypeScript 會將 .ts 檔案的原始內容作為嵌入式字串包含在來源地圖中(使用來源地圖的 sourcesContent 屬性)。這通常在與 inlineSourceMap 相同的情況下很有用。

                  需要設定 sourceMapinlineSourceMap

                  例如,使用這個 TypeScript

                  ts
                  const helloWorld = "hi";
                  console.log(helloWorld);
                  Try

                  預設轉換成此 JavaScript

                  ts
                  "use strict";
                  const helloWorld = "hi";
                  console.log(helloWorld);
                   
                  Try

                  然後啟用使用 inlineSourcesinlineSourceMap 進行建置,檔案底部會有一個註解,其中包含該檔案的來源地圖。請注意,結尾與 inlineSourceMap 中的範例不同,因為來源地圖現在也包含原始原始碼。

                  ts
                  "use strict";
                  const helloWorld = "hi";
                  console.log(helloWorld);
                  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDO0FBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBoZWxsb1dvcmxkID0gXCJoaVwiO1xuY29uc29sZS5sb2coaGVsbG9Xb3JsZCk7Il19
                  Try

                  # Map Root - mapRoot

                  指定偵錯器應在何處尋找對應檔,而不是產生位置。此字串在原始碼對應中逐字處理,例如

                  {
                  "": true,
                  "": "https://my-website.com/debug/sourcemaps/"
                  }
                  }

                  會宣告 index.js 的原始碼對應位於 https://my-website.com/debug/sourcemaps/index.js.map

                    # 新行 - newLine

                    指定產生檔案時要使用的行尾序列:‘CRLF’ (dos) 或 ‘LF’ (unix)。

                    • 預設

                      特定於平台。

                    • 允許
                      • crlf

                      • lf

                    • 已發布

                      1.5

                    # 不產生 - noEmit

                    不產生編譯器輸出檔案,例如 JavaScript 原始碼、原始碼對應或宣告。

                    這為其他工具騰出空間,例如 Babelswc,以處理將 TypeScript 檔案轉換為可以在 JavaScript 環境中執行的檔案。

                    然後,你可以使用 TypeScript 作為提供編輯器整合和原始碼類型檢查器的工具。

                      # 不產生輔助程式 - noEmitHelpers

                      你可以提供你使用的輔助程式的實作,在全域範圍內,而不是使用 importHelpers 匯入輔助程式,並完全關閉輔助函式的產生。

                      例如,在 ES5 中使用這個 async 函式需要一個類似的 await 函式和類似的 generator 函式才能執行

                      ts
                      const getAPI = async (url: string) => {
                      // Get API
                      return {};
                      };
                      Try

                      這會產生相當大量的 JavaScript

                      ts
                      "use strict";
                      var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
                      function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
                      return new (P || (P = Promise))(function (resolve, reject) {
                      function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
                      function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
                      function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
                      step((generator = generator.apply(thisArg, _arguments || [])).next());
                      });
                      };
                      var __generator = (this && this.__generator) || function (thisArg, body) {
                      var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
                      return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
                      function verb(n) { return function (v) { return step([n, v]); }; }
                      function step(op) {
                      if (f) throw new TypeError("Generator is already executing.");
                      while (g && (g = 0, op[0] && (_ = 0)), _) try {
                      if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
                      if (y = 0, t) op = [op[0] & 2, t.value];
                      switch (op[0]) {
                      case 0: case 1: t = op; break;
                      case 4: _.label++; return { value: op[1], done: false };
                      case 5: _.label++; y = op[1]; op = [0]; continue;
                      case 7: op = _.ops.pop(); _.trys.pop(); continue;
                      default:
                      if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                      if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                      if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                      if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                      if (t[2]) _.ops.pop();
                      _.trys.pop(); continue;
                      }
                      op = body.call(thisArg, _);
                      } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
                      if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
                      }
                      };
                      var getAPI = function (url) { return __awaiter(void 0, void 0, void 0, function () {
                      return __generator(this, function (_a) {
                      // Get API
                      return [2 /*return*/, {}];
                      });
                      }); };
                       
                      Try

                      可透過此旗標切換為你自己的全域變數

                      ts
                      "use strict";
                      var getAPI = function (url) { return __awaiter(void 0, void 0, void 0, function () {
                      return __generator(this, function (_a) {
                      // Get API
                      return [2 /*return*/, {}];
                      });
                      }); };
                       
                      Try

                      # 錯誤時不發出 - noEmitOnError

                      如果報告任何錯誤,請勿發出編譯器輸出檔案,例如 JavaScript 原始碼、原始碼對應和宣告。

                      這預設為 false,這讓在類似監控的環境中使用 TypeScript 變得更容易,在這種環境中,你可能希望在確保所有錯誤都已解決之前,在另一個環境中查看程式碼變更的結果。

                      # 輸出目錄 - outDir

                      如果指定,.js(以及 .d.ts.js.map 等)檔案將發出到此目錄。原始原始檔的目錄結構會保留;如果計算出的根目錄不是你想要的,請參閱 rootDir

                      如果未指定,.js 檔案將發出到與產生它們的 .ts 檔案相同的目錄中

                      sh
                      $ tsc
                      example
                      ├── index.js
                      └── index.ts

                      使用類似這樣的 tsconfig.json

                      {
                      "": "dist"
                      }
                      }

                      使用這些設定執行 tsc 會將檔案移至指定的 dist 資料夾

                      sh
                      $ tsc
                      example
                      ├── dist
                      │ └── index.js
                      ├── index.ts
                      └── tsconfig.json

                      # 輸出檔案 - outFile

                      如果指定,所有全域(非模組)檔案都將串接成指定的單一輸出檔案。

                      如果 modulesystemamd,所有模組檔案也會在所有全域內容後串接至這個檔案。

                      注意:除非 moduleNoneSystemAMD,否則無法使用 outFile。此選項無法用於組合 CommonJS 或 ES6 模組。

                      # 保留 Const Enums - preserveConstEnums

                      不要在產生的程式碼中清除 const enum 宣告。const enum 提供一種方式,可以在執行階段透過發出 enum 值,而不是參考,來減少應用程式的整體記憶體使用量。

                      例如,使用此 TypeScript

                      ts
                      const enum Album {
                      JimmyEatWorldFutures = 1,
                      TubRingZooHypothesis = 2,
                      DogFashionDiscoAdultery = 3,
                      }
                       
                      const selectedAlbum = Album.JimmyEatWorldFutures;
                      if (selectedAlbum === Album.JimmyEatWorldFutures) {
                      console.log("That is a great choice.");
                      }
                      Try

                      預設的 const enum 行為是將任何 Album.Something 轉換為對應的數字文字,並從 JavaScript 中完全移除對 enum 的參考。

                      ts
                      "use strict";
                      const selectedAlbum = 1 /* Album.JimmyEatWorldFutures */;
                      if (selectedAlbum === 1 /* Album.JimmyEatWorldFutures */) {
                      console.log("That is a great choice.");
                      }
                       
                      Try

                      preserveConstEnums 設為 true 時,enum 會在執行階段存在,而且數字仍然會發出。

                      ts
                      "use strict";
                      var Album;
                      (function (Album) {
                      Album[Album["JimmyEatWorldFutures"] = 1] = "JimmyEatWorldFutures";
                      Album[Album["TubRingZooHypothesis"] = 2] = "TubRingZooHypothesis";
                      Album[Album["DogFashionDiscoAdultery"] = 3] = "DogFashionDiscoAdultery";
                      })(Album || (Album = {}));
                      const selectedAlbum = 1 /* Album.JimmyEatWorldFutures */;
                      if (selectedAlbum === 1 /* Album.JimmyEatWorldFutures */) {
                      console.log("That is a great choice.");
                      }
                       
                      Try

                      這基本上使此類 const enum 僅成為原始碼功能,而沒有執行階段的追蹤。

                      # 保留值匯入 - preserveValueImports

                      已棄用,建議使用 verbatimModuleSyntax

                      在某些情況下,TypeScript 無法偵測到您正在使用匯入。例如,採用下列程式碼

                      ts
                      import { Animal } from "./animal.js";
                      eval("console.log(new Animal().isDangerous())");

                      或使用「編譯至 HTML」語言(例如 Svelte 或 Vue)的程式碼。preserveValueImports 會阻止 TypeScript 移除匯入,即使它看似未被使用。

                      isolatedModules 結合使用時:匯入的類型必須標記為僅類型,因為一次處理單一檔案的編譯器無法得知匯入是看似未被使用的值,還是必須移除的類型,以避免執行階段崩潰。

                      # 移除註解 - removeComments

                      將 TypeScript 檔案中的所有註解移除,轉換成 JavaScript 時。預設為 false

                      例如,這是一個有 JSDoc 註解的 TypeScript 檔案

                      ts
                      /** The translation of 'Hello world' into Portuguese */
                      export const helloWorldPTBR = "Olá Mundo";

                      removeComments 設為 true

                      ts
                      export const helloWorldPTBR = "Olá Mundo";
                       
                      Try

                      不設定 removeComments 或設為 false

                      ts
                      /** The translation of 'Hello world' into Portuguese */
                      export const helloWorldPTBR = "Olá Mundo";
                       
                      Try

                      這表示您的註解將顯示在 JavaScript 程式碼中。

                        # 原始碼對應表 - sourceMap

                        啟用 原始碼對應表檔案 的產生。這些檔案允許除錯工具和其他工具在實際使用已發出的 JavaScript 檔案時,顯示原始的 TypeScript 原始碼。原始碼對應表檔案會以 .js.map (或 .jsx.map) 檔案發出,緊鄰對應的 .js 輸出檔案。

                        .js 檔案反過來會包含一個原始碼對應表註解,指出檔案在哪裡提供給外部工具,例如

                        ts
                        // helloWorld.ts
                        export declare const helloWorld = "hi";

                        使用 sourceMap 設為 true 編譯會產生下列 JavaScript 檔案

                        js
                        // helloWorld.js
                        "use strict";
                        Object.defineProperty(exports, "__esModule", { value: true });
                        exports.helloWorld = "hi";
                        //# sourceMappingURL=// helloWorld.js.map

                        這也會產生這個 json 對應表

                        json
                        // helloWorld.js.map
                        {
                        "version": 3,
                        "file": "ex.js",
                        "sourceRoot": "",
                        "sources": ["../ex.ts"],
                        "names": [],
                        "mappings": ";;AAAa,QAAA,UAAU,GAAG,IAAI,CAAA"
                        }

                          # 原始碼根目錄 - sourceRoot

                          指定除錯工具應在哪裡找到 TypeScript 檔案,而不是相對原始碼位置。此字串會在原始碼對應表中逐字處理,您可以在其中使用路徑或 URL

                          {
                          "": true,
                          "": "https://my-website.com/debug/source/"
                          }
                          }

                          會宣告 index.js 的原始碼檔案位於 https://my-website.com/debug/source/index.ts

                            # 移除內部 - stripInternal

                            不要為在 JSDoc 註解中具有 @internal 註解的程式碼發出宣告。這是一個內部編譯器選項;請自行承擔風險使用,因為編譯器不會檢查結果是否有效。如果您正在尋找一個工具來處理 d.ts 檔案中更多層級的可見性,請參閱 api-extractor

                            ts
                            /**
                            * Days available in a week
                            * @internal
                            */
                            export const daysInAWeek = 7;
                             
                            /** Calculate how much someone earns in a week */
                            export function weeklySalary(dayRate: number) {
                            return daysInAWeek * dayRate;
                            }
                            Try

                            將旗標設定為 false(預設)

                            ts
                            /**
                            * Days available in a week
                            * @internal
                            */
                            export declare const daysInAWeek = 7;
                            /** Calculate how much someone earns in a week */
                            export declare function weeklySalary(dayRate: number): number;
                             
                            Try

                            stripInternal 設定為 true 會刪節發出的 d.ts

                            ts
                            /** Calculate how much someone earns in a week */
                            export declare function weeklySalary(dayRate: number): number;
                             
                            Try

                            JavaScript 輸出仍然相同。

                            • 內部

                            #JavaScript 支援

                            #允許 JS - allowJs

                            允許在專案內匯入 JavaScript 檔案,而不仅仅是 .ts.tsx 檔案。例如,此 JS 檔案

                            js
                            // @filename: card.js
                            export const defaultCardDeck = "Heart";
                            Try

                            匯入 TypeScript 檔案時會產生錯誤

                            ts
                            // @filename: index.ts
                            import { defaultCardDeck } from "./card";
                             
                            console.log(defaultCardDeck);
                            Try

                            在啟用 allowJs 的情況下順利匯入

                            ts
                            // @filename: index.ts
                            import { defaultCardDeck } from "./card";
                             
                            console.log(defaultCardDeck);
                            Try

                            此旗標可用於將 TypeScript 檔案逐步新增到 JS 專案的方式,允許 .ts.tsx 檔案與現有的 JavaScript 檔案並存。

                            它也可以與 declarationemitDeclarationOnly 搭配使用,以 為 JS 檔案建立宣告

                            #檢查 JS - checkJs

                            allowJs 搭配使用。啟用 checkJs 時,JavaScript 檔案中會回報錯誤。這等於在專案中包含的所有 JavaScript 檔案最上方包含 // @ts-check

                            例如,根據 TypeScript 附帶的 parseFloat 類型定義,這是錯誤的 JavaScript

                            js
                            // parseFloat only takes a string
                            module.exports.pi = parseFloat(3.142);

                            匯入 TypeScript 模組時

                            ts
                            // @filename: constants.js
                            module.exports.pi = parseFloat(3.142);
                             
                            // @filename: index.ts
                            import { pi } from "./constants";
                            console.log(pi);
                            Try

                            您不會收到任何錯誤。但是,如果您開啟 checkJs,您將會從 JavaScript 檔案中收到錯誤訊息。

                            ts
                            // @filename: constants.js
                            Argument of type 'number' is not assignable to parameter of type 'string'.2345Argument of type 'number' is not assignable to parameter of type 'string'.
                            module.exports.pi = parseFloat(3.142);
                             
                            // @filename: index.ts
                            import { pi } from "./constants";
                            console.log(pi);
                            Try

                            # 最大節點模組 JS 深度 - maxNodeModuleJsDepth

                            node_modules 下搜尋並載入 JavaScript 檔案的最大相依深度。

                            此旗標只能在啟用 allowJs 時使用,且在您想要讓 TypeScript 推論 node_modules 中所有 JavaScript 的類型時使用。

                            理想情況下,這應該保持在 0(預設值),且 d.ts 檔案應明確定義模組的形狀。但是,在某些情況下,您可能想要在犧牲速度和潛在準確性的情況下開啟此功能。

                              #編輯器支援

                              #停用大小限制 - disableSizeLimit

                              為避免在處理非常大型 JavaScript 專案時出現可能的記憶體膨脹問題,TypeScript 會分配的記憶體數量有上限。開啟此旗標將移除限制。

                                #外掛程式 - plugins

                                在編輯器內執行的語言服務外掛程式清單。

                                語言服務外掛程式是一種根據現有的 TypeScript 檔案提供使用者額外資訊的方式。它們可以增強 TypeScript 與編輯器之間現有的訊息,或提供它們自己的錯誤訊息。

                                例如

                                VS Code 允許擴充功能自動包含語言服務外掛程式,因此您可以在編輯器中執行一些程式碼,而不需要在 tsconfig.json 中定義它們。

                                  #Interop Constraints

                                  #允許合成預設匯入 - allowSyntheticDefaultImports

                                  設定為 true 時,allowSyntheticDefaultImports 允許您撰寫類似以下的匯入

                                  ts
                                  import React from "react";

                                  而不是

                                  ts
                                  import * as React from "react";

                                  當模組沒有明確指定預設匯出時。

                                  例如,如果 allowSyntheticDefaultImports 不是 true

                                  ts
                                  // @filename: utilFunctions.js
                                  Module '"/home/runner/work/TypeScript-Website/TypeScript-Website/utilFunctions"' has no default export.1192Module '"/home/runner/work/TypeScript-Website/TypeScript-Website/utilFunctions"' has no default export.
                                  const getStringLength = (str) => str.length;
                                   
                                  module.exports = {
                                  getStringLength,
                                  };
                                   
                                  // @filename: index.ts
                                  import utils from "./utilFunctions";
                                   
                                  const count = utils.getStringLength("Check JS");
                                  Try

                                  這段程式碼會產生錯誤,因為沒有可以匯入的 default 物件。即使感覺上應該有。為了方便,Babel 等轉譯器會自動建立預設值,如果沒有建立預設值的話。讓模組看起來更像

                                  js
                                  // @filename: utilFunctions.js
                                  const getStringLength = (str) => str.length;
                                  const allFunctions = {
                                  getStringLength,
                                  };
                                  module.exports = allFunctions;
                                  module.exports.default = allFunctions;

                                  此旗標不會影響 TypeScript 發出的 JavaScript,它僅用於類型檢查。此選項使 TypeScript 的行為與 Babel 保持一致,後者會發出額外程式碼,以使使用模組的預設匯出更符合人體工學。

                                  # ES 模組互通性 - esModuleInterop

                                  預設情況下(esModuleInterop 為 false 或未設定),TypeScript 會將 CommonJS/AMD/UMD 模組視為類似於 ES6 模組。在這樣做時,特別是兩個部分被證明是錯誤的假設

                                  • 名稱空間匯入,例如 import * as moment from "moment",作用與 const moment = require("moment") 相同

                                  • 預設匯入,例如 import moment from "moment",作用與 const moment = require("moment").default 相同

                                  此不匹配會導致這兩個問題

                                  • ES6 模組規範指出,名稱空間匯入(import * as x)只能是物件,透過讓 TypeScript 將其視為與 = require("x") 相同,TypeScript 允許將匯入視為函式並可呼叫。這不符合規範。

                                  • 儘管符合 ES6 模組規範,但大多數具有 CommonJS/AMD/UMD 模組的函式庫並不像 TypeScript 的實作那樣嚴格遵循。

                                  開啟 esModuleInterop 將修正 TypeScript 編譯的程式碼中的這兩個問題。第一個會變更編譯器的行為,第二個則由兩個新的輔助函式修正,這些函式提供一個 shim,以確保發出的 JavaScript 中的相容性

                                  ts
                                  import * as fs from "fs";
                                  import _ from "lodash";
                                  fs.readFileSync("file.txt", "utf8");
                                  _.chunk(["a", "b", "c", "d"], 2);

                                  esModuleInterop 已停用時

                                  ts
                                  "use strict";
                                  Object.defineProperty(exports, "__esModule", { value: true });
                                  const fs = require("fs");
                                  const lodash_1 = require("lodash");
                                  fs.readFileSync("file.txt", "utf8");
                                  lodash_1.default.chunk(["a", "b", "c", "d"], 2);
                                   
                                  Try

                                  esModuleInterop 設為 true

                                  ts
                                  "use strict";
                                  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
                                  if (k2 === undefined) k2 = k;
                                  var desc = Object.getOwnPropertyDescriptor(m, k);
                                  if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
                                  desc = { enumerable: true, get: function() { return m[k]; } };
                                  }
                                  Object.defineProperty(o, k2, desc);
                                  }) : (function(o, m, k, k2) {
                                  if (k2 === undefined) k2 = k;
                                  o[k2] = m[k];
                                  }));
                                  var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
                                  Object.defineProperty(o, "default", { enumerable: true, value: v });
                                  }) : function(o, v) {
                                  o["default"] = v;
                                  });
                                  var __importStar = (this && this.__importStar) || function (mod) {
                                  if (mod && mod.__esModule) return mod;
                                  var result = {};
                                  if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
                                  __setModuleDefault(result, mod);
                                  return result;
                                  };
                                  var __importDefault = (this && this.__importDefault) || function (mod) {
                                  return (mod && mod.__esModule) ? mod : { "default": mod };
                                  };
                                  Object.defineProperty(exports, "__esModule", { value: true });
                                  const fs = __importStar(require("fs"));
                                  const lodash_1 = __importDefault(require("lodash"));
                                  fs.readFileSync("file.txt", "utf8");
                                  lodash_1.default.chunk(["a", "b", "c", "d"], 2);
                                   
                                  Try

                                  注意:命名空間匯入 import * as fs from "fs" 僅適用於匯入物件上 已擁有 (基本上是設定在物件上而非透過原型鏈) 的屬性。如果您要匯入的模組使用繼承屬性定義其 API,您需要使用預設匯入表單 (import fs from "fs"),或停用 esModuleInterop

                                  注意:您可以透過啟用 importHelpers,讓 JS 產生更簡潔的程式碼

                                  ts
                                  "use strict";
                                  Object.defineProperty(exports, "__esModule", { value: true });
                                  const tslib_1 = require("tslib");
                                  const fs = tslib_1.__importStar(require("fs"));
                                  const lodash_1 = tslib_1.__importDefault(require("lodash"));
                                  fs.readFileSync("file.txt", "utf8");
                                  lodash_1.default.chunk(["a", "b", "c", "d"], 2);
                                   
                                  Try

                                  啟用 esModuleInterop 也會啟用 allowSyntheticDefaultImports

                                  # 在檔案名稱中強制一致大小寫 - forceConsistentCasingInFileNames

                                  TypeScript 會遵循其執行所在檔案系統的大小寫敏感性規則。如果某些開發人員在大小寫敏感的檔案系統中工作,而其他開發人員則不在,這可能會造成問題。如果檔案嘗試透過指定 ./FileManager.ts 來匯入 fileManager.ts,則會在大小寫不敏感的檔案系統中找到檔案,但不會在大小寫敏感的檔案系統中找到檔案。

                                  當設定此選項時,如果程式嘗試透過與磁碟上大小寫不同的方式來包含檔案,TypeScript 會發出錯誤。

                                  • 建議
                                  • 預設

                                    true

                                  # 隔離模組 - isolatedModules

                                  雖然你可以使用 TypeScript 從 TypeScript 程式碼產生 JavaScript 程式碼,但使用其他轉譯器(例如 Babel)來執行此操作也很常見。不過,其他轉譯器一次只會作用於單一檔案,這表示它們無法套用依賴於了解完整類型系統的程式碼轉換。此限制也適用於某些建置工具所使用的 TypeScript ts.transpileModule API。

                                  這些限制可能會造成執行時期問題,例如 const enumnamespace 等 TypeScript 功能。設定 isolatedModules 旗標會指示 TypeScript 在你撰寫無法由單一檔案轉譯程序正確詮釋的特定程式碼時發出警告。

                                  它不會變更你的程式碼行為,或以其他方式變更 TypeScript 檢查和發出程序的行為。

                                  以下是一些在啟用 isolatedModules 時無法運作的程式碼範例。

                                  非值識別項的匯出

                                  在 TypeScript 中,你可以匯入一個 類型,然後再匯出它

                                  ts
                                  import { someType, someFunction } from "someModule";
                                   
                                  someFunction();
                                   
                                  export { someType, someFunction };
                                  Try

                                  由於 someType 沒有值,發出的 export 就不會嘗試匯出它(這會在 JavaScript 中造成執行時期錯誤)

                                  js
                                  export { someFunction };

                                  單一檔案轉譯器不知道 someType 是否會產生值,所以匯出只參考型別的名稱會產生錯誤。

                                  非模組檔案

                                  如果設定 isolatedModules,命名空間只允許在模組中(表示它有某種形式的 import/export)。如果在非模組檔案中找到命名空間,就會發生錯誤

                                  ts
                                  namespace Instantiated {
                                  Namespaces are not allowed in global script files when 'isolatedModules' is enabled. If this file is not intended to be a global script, set 'moduleDetection' to 'force' or add an empty 'export {}' statement.1280Namespaces are not allowed in global script files when 'isolatedModules' is enabled. If this file is not intended to be a global script, set 'moduleDetection' to 'force' or add an empty 'export {}' statement.
                                  export const x = 1;
                                  }
                                  Try

                                  這個限制不適用於 .d.ts 檔案。

                                  const enum 成員的參考

                                  在 TypeScript 中,當你參考 const enum 成員時,參考會在發出的 JavaScript 中替換為其實際值。變更這個 TypeScript

                                  ts
                                  declare const enum Numbers {
                                  Zero = 0,
                                  One = 1,
                                  }
                                  console.log(Numbers.Zero + Numbers.One);
                                  Try

                                  為這個 JavaScript

                                  ts
                                  "use strict";
                                  console.log(0 + 1);
                                   
                                  Try

                                  如果不知道這些成員的值,其他轉譯器無法取代對 Numbers 的參照,如果置之不理,這會是執行時期錯誤(因為執行時期沒有 Numbers 物件)。因此,當設定 isolatedModules 時,參照環境 const enum 成員會出現錯誤。

                                    這是為了反映 Node.js 中的相同標記;它不會解析符號連結的實際路徑。

                                    此標記也表現出與 Webpack 的 resolve.symlinks 選項相反的行為(即將 TypeScript 的 preserveSymlinks 設定為 true 與將 Webpack 的 resolve.symlinks 設定為 false 平行,反之亦然)。

                                    啟用此功能後,對模組和套件的參照(例如 import/// <reference type="..." /> 指令)都相對於符號連結檔案的位置解析,而不是相對於符號連結解析到的路徑。

                                      # 原文模組語法 - verbatimModuleSyntax

                                      預設情況下,TypeScript 會執行稱為匯入省略的動作。基本上,如果您撰寫類似

                                      ts
                                      import { Car } from "./car";
                                      export function drive(car: Car) {
                                      // ...
                                      }

                                      TypeScript 會偵測到您僅使用匯入來取得類型,並完全略過匯入。您的輸出 JavaScript 可能看起來像這樣

                                      js
                                      export function drive(car) {
                                      // ...
                                      }

                                      大多數時候這很好,因為如果 Car 不是從 ./car 匯出的值,我們會得到執行時期錯誤。

                                      但它確實為某些特殊情況增加了複雜性。例如,請注意沒有類似 import "./car"; 的陳述式 - 匯入已完全略過。對於有或沒有副作用的模組,這實際上會產生差異。

                                      TypeScript 的 JavaScript 發射策略也有其他幾層複雜性 - 匯入省略並非總是僅由匯入的使用方式驅動 - 它通常也會諮詢值的宣告方式。因此,以下代碼是否

                                      ts
                                      export { Car } from "./car";

                                      應予保留或刪除並不總是明確的。如果 Car 是使用類似 class 的東西宣告的,那麼它可以在產生的 JavaScript 檔案中保留。但如果 Car 僅宣告為 type 別名或 interface,那麼 JavaScript 檔案根本不應匯出 Car

                                      雖然 TypeScript 可能能夠根據來自不同檔案中的資訊做出這些發射決策,但並非每個編譯器都能做到。

                                      匯入和匯出的 type 修飾詞有助於解決這些情況。我們可以明確指出匯入或匯出是否僅用於類型分析,並且可以使用 type 修飾詞在 JavaScript 檔案中完全刪除。

                                      ts
                                      // This statement can be dropped entirely in JS output
                                      import type * as car from "./car";
                                      // The named import/export 'Car' can be dropped in JS output
                                      import { type Car } from "./car";
                                      export { type Car } from "./car";

                                      type 修飾詞本身並不太有用 - 預設情況下,模組省略仍會刪除匯入,而且沒有什麼能強迫你區分 type 和一般匯入和匯出。因此,TypeScript 有旗標 --importsNotUsedAsValues 以確保你使用 type 修飾詞,--preserveValueImports 以防止某些模組省略行為,以及 --isolatedModules 以確保你的 TypeScript 代碼可以在不同的編譯器中執行。不幸的是,了解這 3 個旗標的詳細資訊很困難,而且仍然有一些具有意外行為的邊緣案例。

                                      TypeScript 5.0 引進了一個名為 --verbatimModuleSyntax 的新選項,以簡化情況。規則變得更簡單了 - 任何沒有 type 修飾詞的匯入或匯出都保留。任何使用 type 修飾詞的都會被完全刪除。

                                      ts
                                      // Erased away entirely.
                                      import type { A } from "a";
                                      // Rewritten to 'import { b } from "bcd";'
                                      import { b, type c, type d } from "bcd";
                                      // Rewritten to 'import {} from "xyz";'
                                      import { type xyz } from "xyz";

                                      有了這個新選項,你看到的就是你得到的。

                                      不過,在模組互通方面確實有一些影響。在此標記下,當你的設定或檔案副檔名暗示不同的模組系統時,ECMAScript importexport 就不會被改寫為 require 呼叫。相反地,你會收到一個錯誤。如果你需要發出使用 requiremodule.exports 的程式碼,你必須使用早於 ES2015 的 TypeScript 模組語法

                                      輸入 TypeScript 輸出 JavaScript
                                      ts
                                      import foo = require("foo");
                                      js
                                      const foo = require("foo");
                                      ts
                                      function foo() {}
                                      function bar() {}
                                      function baz() {}
                                      export = {
                                      foo,
                                      bar,
                                      baz,
                                      };
                                      js
                                      function foo() {}
                                      function bar() {}
                                      function baz() {}
                                      module.exports = {
                                      foo,
                                      bar,
                                      baz,
                                      };

                                      儘管這是一個限制,但它確實有助於讓一些問題更明顯。例如,在 --module node16 下,很容易忘記在 package.json 中設定 type 欄位。因此,開發人員會開始撰寫 CommonJS 模組,而不是 ES 模組,而沒有意識到這一點,導致令人驚訝的查詢規則和 JavaScript 輸出。這個新標記確保你對正在使用的檔案類型有明確的意圖,因為語法是有意不同的。

                                      由於 --verbatimModuleSyntax 提供了一個比 --importsNotUsedAsValues--preserveValueImports 更一致的說法,因此這兩個現有標記將被棄用,取而代之的是它。

                                      如需更多詳細資訊,請閱讀 原始拉取請求其提案問題

                                        #後向相容性

                                        # 字元集 - charset

                                        在 TypeScript 的先前版本中,這控制了從磁碟讀取文字檔時使用的編碼。現在,TypeScript 預設 UTF-8 編碼,但會正確偵測 UTF-16 (BE 和 LE) 或 UTF-8 BOM。

                                        • 已棄用
                                        • 預設

                                          utf8

                                        # 僅限字串的 Keyof - keyofStringsOnly

                                        此旗標會將 keyof 類型運算子變更為在套用至具有字串索引簽章的類型時傳回 string,而不是 string | number

                                        此旗標用於協助使用者避免 在 TypeScript 2.9 發行之前 的此行為。

                                        • 已棄用
                                        • 已發布

                                          2.9

                                        # 沒有隱含的嚴格使用 - noImplicitUseStrict

                                        您不需要這個。預設情況下,在將模組檔案發射至非 ES6 目標時,TypeScript 會在檔案頂端發射 "use strict"; 序言。此設定會停用序言。

                                          # 沒有嚴格的泛型檢查 - noStrictGenericChecks

                                          在比較兩個泛型函數時,TypeScript 會統一類型參數。

                                          ts
                                          type A = <T, U>(x: T, y: U) => [T, U];
                                          type B = <S>(x: S, y: S) => [S, S];
                                           
                                          function f(a: A, b: B) {
                                          b = a; // Ok
                                          a = b; // Error
                                          Type 'B' is not assignable to type 'A'. Types of parameters 'y' and 'y' are incompatible. Type 'U' is not assignable to type 'T'. 'T' could be instantiated with an arbitrary type which could be unrelated to 'U'.2322Type 'B' is not assignable to type 'A'. Types of parameters 'y' and 'y' are incompatible. Type 'U' is not assignable to type 'T'. 'T' could be instantiated with an arbitrary type which could be unrelated to 'U'.
                                          }
                                          Try

                                          此旗標可用於移除該檢查。

                                          # 輸出 - out

                                          改用 outFile

                                          out 選項會以不可預測或不一致的方式計算最終檔案位置。此選項僅保留以維持向後相容性,且已棄用。

                                          # 抑制多餘屬性錯誤 - suppressExcessPropertyErrors

                                          這會停用多餘屬性錯誤的回報,例如以下範例中顯示的錯誤

                                          ts
                                          type Point = { x: number; y: number };
                                          const p: Point = { x: 1, y: 3, m: 10 };
                                          Type '{ x: number; y: number; m: number; }' is not assignable to type 'Point'. Object literal may only specify known properties, and 'm' does not exist in type 'Point'.2322Type '{ x: number; y: number; m: number; }' is not assignable to type 'Point'. Object literal may only specify known properties, and 'm' does not exist in type 'Point'.
                                          Try

                                          新增此旗標,協助使用者將 TypeScript 1.6 中較嚴格的新物件文字檢查遷移過去。

                                          我們不建議在現代程式碼庫中使用此旗標,您可以使用 // @ts-ignore 抑制您需要抑制的單一案例。

                                            # 抑制隱含 Any 索引錯誤 - suppressImplicitAnyIndexErrors

                                            開啟 suppressImplicitAnyIndexErrors 會抑制在索引物件時關於隱含 any 的錯誤回報,如下例所示

                                            ts
                                            const obj = { x: 10 };
                                            console.log(obj["foo"]);
                                            Element implicitly has an 'any' type because expression of type '"foo"' can't be used to index type '{ x: number; }'. Property 'foo' does not exist on type '{ x: number; }'.7053Element implicitly has an 'any' type because expression of type '"foo"' can't be used to index type '{ x: number; }'. Property 'foo' does not exist on type '{ x: number; }'.
                                            Try

                                            使用 suppressImplicitAnyIndexErrors 是一種相當激烈的做法。建議改用 @ts-ignore 註解

                                            ts
                                            const obj = { x: 10 };
                                            // @ts-ignore
                                            console.log(obj["foo"]);
                                            Try

                                            #語言和環境

                                            # 發出裝飾器元資料 - emitDecoratorMetadata

                                            啟用實驗性支援,以發出裝飾器的類型元資料,這會與模組 reflect-metadata 搭配使用。

                                            例如,以下是 TypeScript

                                            ts
                                            function LogMethod(
                                            target: any,
                                            propertyKey: string | symbol,
                                            descriptor: PropertyDescriptor
                                            ) {
                                            console.log(target);
                                            console.log(propertyKey);
                                            console.log(descriptor);
                                            }
                                             
                                            class Demo {
                                            @LogMethod
                                            public foo(bar: number) {
                                            // do nothing
                                            }
                                            }
                                             
                                            const demo = new Demo();
                                            Try

                                            如果未將 emitDecoratorMetadata 設定為 true (預設值),發出的 JavaScript 如下所示

                                            ts
                                            "use strict";
                                            var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
                                            var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
                                            if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
                                            else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
                                            return c > 3 && r && Object.defineProperty(target, key, r), r;
                                            };
                                            function LogMethod(target, propertyKey, descriptor) {
                                            console.log(target);
                                            console.log(propertyKey);
                                            console.log(descriptor);
                                            }
                                            class Demo {
                                            foo(bar) {
                                            // do nothing
                                            }
                                            }
                                            __decorate([
                                            LogMethod
                                            ], Demo.prototype, "foo", null);
                                            const demo = new Demo();
                                             
                                            Try

                                            如果將 emitDecoratorMetadata 設定為 true,發出的 JavaScript 如下所示

                                            ts
                                            "use strict";
                                            var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
                                            var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
                                            if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
                                            else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
                                            return c > 3 && r && Object.defineProperty(target, key, r), r;
                                            };
                                            var __metadata = (this && this.__metadata) || function (k, v) {
                                            if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
                                            };
                                            function LogMethod(target, propertyKey, descriptor) {
                                            console.log(target);
                                            console.log(propertyKey);
                                            console.log(descriptor);
                                            }
                                            class Demo {
                                            foo(bar) {
                                            // do nothing
                                            }
                                            }
                                            __decorate([
                                            LogMethod,
                                            __metadata("design:type", Function),
                                            __metadata("design:paramtypes", [Number]),
                                            __metadata("design:returntype", void 0)
                                            ], Demo.prototype, "foo", null);
                                            const demo = new Demo();
                                             
                                            Try

                                            # 實驗性裝飾器 - experimentalDecorators

                                            啟用 裝飾器的實驗性支援,這是早於 TC39 標準化程序的裝飾器版本。

                                            裝飾器是一種語言功能,尚未完全納入 JavaScript 規範。這表示當 TC39 決定時,TypeScript 中的實作版本可能與 JavaScript 中的實作不同。

                                            您可以在 手冊 中了解有關 TypeScript 中裝飾器支援的更多資訊。

                                            # JSX - jsx

                                            控制在 JavaScript 檔案中發射 JSX 建構的方式。這只會影響從 .tsx 檔案開始的 JS 檔案輸出。

                                            • react:發射 .js 檔案,其中 JSX 已變更為等效的 React.createElement 呼叫
                                            • react-jsx:發射 .js 檔案,其中 JSX 已變更為 _jsx 呼叫
                                            • react-jsxdev:發射 .js 檔案,其中 JSX 已變更為 _jsx 呼叫
                                            • preserve:發射 .jsx 檔案,其中 JSX 未變更
                                            • react-native:發射 .js 檔案,其中 JSX 未變更

                                            例如

                                            這個範例程式碼

                                            tsx
                                            export const HelloWorld = () => <h1>Hello world</h1>;

                                            預設:"react"

                                            tsx
                                            import React from 'react';
                                            export const HelloWorld = () => React.createElement("h1", null, "Hello world");
                                             
                                            Try

                                            保留:"preserve"

                                            tsx
                                            import React from 'react';
                                            export const HelloWorld = () => <h1>Hello world</h1>;
                                             
                                            Try

                                            React Native:"react-native"

                                            tsx
                                            import React from 'react';
                                            export const HelloWorld = () => <h1>Hello world</h1>;
                                             
                                            Try

                                            React 17 轉換:"react-jsx"[1]

                                            tsx
                                            import { jsx as _jsx } from "react/jsx-runtime";
                                            import React from 'react';
                                            export const HelloWorld = () => _jsx("h1", { children: "Hello world" });
                                             
                                            Try

                                            React 17 開發轉換:"react-jsxdev"[1]

                                            tsx
                                            import { jsxDEV as _jsxDEV } from "react/jsx-dev-runtime";
                                            const _jsxFileName = "/home/runner/work/TypeScript-Website/TypeScript-Website/index.tsx";
                                            import React from 'react';
                                            export const HelloWorld = () => _jsxDEV("h1", { children: "Hello world" }, void 0, false, { fileName: _jsxFileName, lineNumber: 9, columnNumber: 32 }, this);
                                             
                                            Try

                                            # JSX 工廠 - jsxFactory

                                            使用傳統 JSX 執行時期編譯 JSX 元素時,變更在 .js 檔案中呼叫的函式。最常見的變更是在使用 preact 時,將預設的 "React.createElement" 改為使用 "h""preact.h"

                                            例如,這個 TSX 檔案

                                            tsx
                                            import { h } from "preact";
                                            const HelloWorld = () => <div>Hello</div>;

                                            jsxFactory: "h" 的情況下看起來像

                                            tsx
                                            const preact_1 = require("preact");
                                            const HelloWorld = () => (0, preact_1.h)("div", null, "Hello");
                                             
                                            Try

                                            這個選項也可以用於每個檔案,類似於 Babel 的 /** @jsx h */ 指令

                                            tsx
                                            /** @jsx h */
                                            import { h } from "preact";
                                             
                                            const HelloWorld = () => <div>Hello</div>;
                                            Try

                                            所選的工廠也會影響在回溯到全域之前,JSX 命名空間的查詢位置(用於類型檢查資訊)。

                                            如果工廠定義為 React.createElement(預設),編譯器會在檢查全域 JSX 之前,檢查 React.JSX。如果工廠定義為 h,它會在全域 JSX 之前,檢查 h.JSX

                                            # JSX 片段工廠 - jsxFragmentFactory

                                            指定在目標為 React JSX 輸出時要使用的 JSX 片段工廠函式,並指定 jsxFactory 編譯器選項,例如 Fragment

                                            例如,使用這個 TSConfig

                                            {
                                            "": "esnext",
                                            "": "commonjs",
                                            "": "react",
                                            "": "h",
                                            "": "Fragment"
                                            }
                                            }

                                            這個 TSX 檔案

                                            tsx
                                            import { h, Fragment } from "preact";
                                            const HelloWorld = () => (
                                            <>
                                            <div>Hello</div>
                                            </>
                                            );

                                            會看起來像

                                            tsx
                                            const preact_1 = require("preact");
                                            const HelloWorld = () => ((0, preact_1.h)(preact_1.Fragment, null,
                                            (0, preact_1.h)("div", null, "Hello")));
                                             
                                            Try

                                            這個選項也可以用在每個檔案的基礎上,類似於 Babel 的 /* @jsxFrag h */ 指令

                                            例如

                                            tsx
                                            /** @jsx h */
                                            /** @jsxFrag Fragment */
                                             
                                            import { h, Fragment } from "preact";
                                             
                                            const HelloWorld = () => (
                                            <>
                                            <div>Hello</div>
                                            </>
                                            );
                                            Try

                                            # JSX Import Source - jsxImportSource

                                            在使用 jsx 作為 "react-jsx""react-jsxdev"(在 TypeScript 4.1 中引入)時,宣告要使用的模組規格說明,用於匯入 jsxjsxs 工廠函式。

                                            使用 React 17,這個函式庫支援透過獨立匯入的一種新的 JSX 轉換形式。

                                            例如,使用這個程式碼

                                            tsx
                                            import React from "react";
                                            function App() {
                                            return <h1>Hello World</h1>;
                                            }

                                            使用這個 TSConfig

                                            {
                                            "": "esnext",
                                            "": "commonjs",
                                            "": "react-jsx"
                                            }
                                            }

                                            TypeScript 發出的 JavaScript 是

                                            tsx
                                            "use strict";
                                            var __importDefault = (this && this.__importDefault) || function (mod) {
                                            return (mod && mod.__esModule) ? mod : { "default": mod };
                                            };
                                            Object.defineProperty(exports, "__esModule", { value: true });
                                            const jsx_runtime_1 = require("react/jsx-runtime");
                                            const react_1 = __importDefault(require("react"));
                                            function App() {
                                            return (0, jsx_runtime_1.jsx)("h1", { children: "Hello World" });
                                            }
                                             
                                            Try

                                            例如,如果你想要使用 "jsxImportSource": "preact",你需要一個像這樣的 tsconfig

                                            {
                                            "": "esnext",
                                            "": "commonjs",
                                            "": "react-jsx",
                                            "": "preact",
                                            "": ["preact"]
                                            }
                                            }

                                            它會產生像這樣的程式碼

                                            tsx
                                            function App() {
                                            return (0, jsx_runtime_1.jsx)("h1", { children: "Hello World" });
                                            }
                                            exports.App = App;
                                             
                                            Try

                                            或者,你可以使用每個檔案的語法來設定這個選項,例如

                                            tsx
                                            /** @jsxImportSource preact */
                                            export function App() {
                                            return <h1>Hello World</h1>;
                                            }

                                            會新增 preact/jsx-runtime 作為 _jsx 工廠的匯入。

                                            注意:為了讓它像你預期的那樣運作,你的 tsx 檔案必須包含 exportimport,這樣它才會被視為一個模組。

                                            # Lib - lib

                                            TypeScript 包含一組內建 JS API(例如 Math)的預設類型定義,以及瀏覽器環境中找到的事物的類型定義(例如 document)。TypeScript 也包含與你指定的 target 相符的新 JS 功能的 API;例如,如果 targetES6 或更新版本,則可以使用 Map 的定義。

                                            你可能想因為幾個原因而改變它們

                                            • 您的程式不會在瀏覽器中執行,因此您不需要 "dom" 型別定義
                                            • 您的執行時期平台提供某些 JavaScript API 物件(可能是透過多重載入),但尚未支援特定 ECMAScript 版本的完整語法
                                            • 您有較高階 ECMAScript 版本的部分多重載入或原生實作,但並非全部

                                            在 TypeScript 4.5 中,npm 模組可以覆寫 lib 檔案,在 部落格中了解更多資訊。

                                            高階函式庫

                                            名稱 內容
                                            ES5 所有 ES3 和 ES5 功能的核心定義
                                            ES2015 ES2015(也稱為 ES6)中提供的其他 API - array.findPromiseProxySymbolMapSetReflect 等。
                                            ES6 「ES2015」的別名
                                            ES2016 ES2016 中提供的其他 API - array.include 等。
                                            ES7 「ES2016」的別名
                                            ES2017 ES2017 中提供的其他 API - Object.entriesObject.valuesAtomicsSharedArrayBufferdate.formatToParts、型別化陣列等。
                                            ES2018 ES2018 中提供的其他 API - async 可迭代、promise.finallyIntl.PluralRulesregexp.groups 等。
                                            ES2019 ES2019 中新增的 API - array.flatarray.flatMapObject.fromEntriesstring.trimStartstring.trimEnd 等。
                                            ES2020 ES2020 中新增的 API - string.matchAll 等。
                                            ES2021 ES2021 中新增的 API - promise.anystring.replaceAll 等。
                                            ES2022 ES2022 中新增的 API - array.atRegExp.hasIndices 等。
                                            ESNext ESNext 中新增的 API - 隨著 JavaScript 規格的演進而有所變化
                                            DOM DOM 定義 - windowdocument 等。
                                            WebWorker WebWorker 環境中可用的 API
                                            ScriptHost Windows Script Hosting System 的 API

                                            個別函式庫元件

                                            名稱
                                            DOM.Iterable
                                            ES2015.Core
                                            ES2015.Collection
                                            ES2015.Generator
                                            ES2015.Iterable
                                            ES2015.Promise
                                            ES2015.Proxy
                                            ES2015.Reflect
                                            ES2015.Symbol
                                            ES2015.Symbol.WellKnown
                                            ES2016.Array.Include
                                            ES2017.object
                                            ES2017.Intl
                                            ES2017.SharedMemory
                                            ES2017.String
                                            ES2017.TypedArrays
                                            ES2018.Intl
                                            ES2018.Promise
                                            ES2018.RegExp
                                            ES2019.Array
                                            ES2019.Object
                                            ES2019.String
                                            ES2019.Symbol
                                            ES2020.String
                                            ES2020.Symbol.wellknown
                                            ES2021.Promise
                                            ES2021.String
                                            ES2021.WeakRef
                                            ESNext.AsyncIterable
                                            ESNext.Array
                                            ESNext.Intl
                                            ESNext.Symbol

                                            此清單可能已過時,您可以在 TypeScript 原始碼 中查看完整清單。

                                            # 模組偵測 - moduleDetection

                                            此設定控制 TypeScript 如何判斷檔案是 指令碼或模組

                                            有三個選項

                                            • "auto" (預設) - TypeScript 不僅會尋找 import 和 export 陳述式,還會檢查在使用 modulenodenextnode16 執行時,package.json 中的 "type" 欄位是否設為 "module",以及在使用 jsxreact-jsx 執行時,目前的檔案是否為 JSX 檔案。

                                            • "legacy" - 與 4.6 及更早版本相同的行為,使用 import 和 export 陳述式來判斷檔案是否為模組。

                                            • "force" - 確保每個非宣告檔案都視為模組。

                                            • 預設

                                              "auto": 將具有 import、export、import.meta、jsx(使用 jsx: react-jsx)或 esm 格式(使用 module: node16+)的檔案視為模組。

                                            • 允許
                                              • 舊版

                                              • 自動

                                              • 強制

                                            • 已發布

                                              4.7

                                            # 無函式庫 - noLib

                                            停用任何函式庫檔案的自動納入。如果設定此選項,將略過 lib

                                            TypeScript 無法在沒有關鍵基本型別介面的情況下編譯任何內容,例如:ArrayBooleanFunctionIArgumentsNumberObjectRegExpString。如果您使用 noLib,預期您會包含這些型別的自己的定義。

                                            # React Namespace - reactNamespace

                                            改用 jsxFactory。在針對 TSX 檔案的 react 指定用於 createElement 的物件。

                                            • 預設

                                              React

                                            # 目標 - target

                                            現代瀏覽器支援所有 ES6 功能,因此 ES6 是個不錯的選擇。如果您的程式碼部署到較舊的環境,您可能會選擇設定較低的目標;如果您的程式碼保證在較新的環境中執行,則可能會選擇較高的目標。

                                            target 設定會變更哪些 JS 功能會降級,以及哪些功能會保持不變。例如,如果 target 是 ES5 或更低,箭頭函式 () => this 會轉換成等效的 function 表達式。

                                            變更 target 也會變更 lib 的預設值。您可以依需要「混搭」targetlib 設定,但您也可以只設定 target 以簡化操作。

                                            對於像 Node 這樣的開發人員平台,會根據平台類型及其版本為 target 設定基準。您可以在 tsconfig/bases 找到社群組織的一組 TSConfigs,其中包含常見平台及其版本的組態。

                                            特殊的 ESNext 值是指 TypeScript 版本支援的最高版本。此設定應謹慎使用,因為它在不同的 TypeScript 版本之間並非代表相同的意思,而且可能會使升級變得難以預測。

                                            • 預設

                                              ES3

                                            • 允許
                                              • es3

                                              • es5

                                              • es6/es2015

                                              • es2016

                                              • es2017

                                              • es2018

                                              • es2019

                                              • es2020

                                              • es2021

                                              • es2022

                                              • esnext

                                            • 已發布

                                              1.0

                                            # 使用定義為類別欄位 - useDefineForClassFields

                                            此旗標用於遷移至即將推出的類別欄位標準版本。TypeScript 在 TC39 批准之前很多年就引入了類別欄位。即將推出的規格的最新版本具有與 TypeScript 實作不同的執行時期行為,但語法相同。

                                            此旗標會切換至即將推出的 ECMA 執行時期行為。

                                            您可以在 3.7 發行說明 中進一步了解此轉換。

                                            • 預設

                                              如果 targetES2022 或更高版本(包括 ESNext),則為 true;否則為 false

                                            • 已發布

                                              3.7

                                            #編譯器診斷

                                            # 診斷 - diagnostics

                                            用於輸出偵錯的診斷資訊。此指令是 extendedDiagnostics 的子集,後者是較為使用者導向的結果,且較容易解讀。

                                            如果 TypeScript 編譯器工程師要求您在編譯中使用此標記提供結果,則使用 extendedDiagnostics 無妨。

                                            # 解釋檔案 - explainFiles

                                            列印 TypeScript 視為專案一部分的檔案名稱,以及它們成為編譯一部分的原因。

                                            例如,只有一個 index.ts 檔案的專案

                                            sh
                                            example
                                            ├── index.ts
                                            ├── package.json
                                            └── tsconfig.json

                                            使用將 explainFiles 設定為 true 的 tsconfig.json

                                            json
                                            {
                                            "compilerOptions": {
                                            "target": "es5",
                                            "module": "commonjs",
                                            "explainFiles": true
                                            }
                                            }

                                            針對此資料夾執行 TypeScript 會產生類似這樣的輸出

                                            ❯ tsc node_modules/typescript/lib/lib.d.ts Default library for target 'es5' node_modules/typescript/lib/lib.es5.d.ts Library referenced via 'es5' from file 'node_modules/typescript/lib/lib.d.ts' node_modules/typescript/lib/lib.dom.d.ts Library referenced via 'dom' from file 'node_modules/typescript/lib/lib.d.ts' node_modules/typescript/lib/lib.webworker.importscripts.d.ts Library referenced via 'webworker.importscripts' from file 'node_modules/typescript/lib/lib.d.ts' node_modules/typescript/lib/lib.scripthost.d.ts Library referenced via 'scripthost' from file 'node_modules/typescript/lib/lib.d.ts' index.ts Matched by include pattern '**/*' in 'tsconfig.json'

                                            以上的輸出顯示

                                            • 根據 target 進行的初始 lib.d.ts 查詢,以及所引用的 .d.ts 檔案鏈
                                            • 透過 include 的預設模式找到的 index.ts 檔案

                                            此選項用於偵錯檔案如何成為編譯的一部分。

                                            # 延伸診斷 - extendedDiagnostics

                                            您可以使用此標記來找出 TypeScript 在編譯時花費時間的地方。這是用於了解程式碼庫整體效能特性的工具。

                                            您可以在 wiki 的 效能區段中進一步了解如何測量和了解輸出。

                                            # 產生 CPU 剖析檔 - generateCpuProfile

                                            此選項讓您可以在編譯器執行期間讓 TypeScript 發出 v8 CPU 剖析檔。CPU 剖析檔可以提供深入了解您的組建為何緩慢的資訊。

                                            此選項只能透過 CLI 使用:--generateCpuProfile tsc-output.cpuprofile

                                            sh
                                            npm run tsc --generateCpuProfile tsc-output.cpuprofile

                                            此檔案可以在基於 Chromium 的瀏覽器中開啟,例如 Chrome 或 Edge Developer,在 CPU 剖析器 區段中。您可以在 TypeScript wiki 的效能區段 中進一步了解如何了解編譯器的效能。

                                            • 預設

                                              profile.cpuprofile

                                            • 已發布

                                              3.7

                                            # 列出已發出的檔案 - listEmittedFiles

                                            將編譯中產生的檔案名稱印出到終端機。

                                            此標記在兩種情況下很有用

                                            • 您想要在終端機中將 TypeScript 編譯為組建鏈的一部分,其中檔案名稱會在下一條指令中處理。
                                            • 您不確定 TypeScript 是否已包含您預期的檔案,作為除錯 檔案包含設定 的一部分。

                                            例如

                                            example ├── index.ts ├── package.json └── tsconfig.json

                                            使用

                                            {
                                            "": true,
                                            "": true
                                            }
                                            }

                                            會產生路徑回音,例如

                                            $ npm run tsc path/to/example/index.js path/to/example/index.d.ts

                                            通常,TypeScript 會在成功時靜默傳回。

                                              # 列出檔案 - listFiles

                                              印出編譯中檔案的名稱。當您不確定 TypeScript 是否已包含您預期的檔案時,這很有用。

                                              例如

                                              example ├── index.ts ├── package.json └── tsconfig.json

                                              使用

                                              {
                                              "": true
                                              }
                                              }

                                              會產生路徑回音,例如

                                              $ npm run tsc path/to/example/node_modules/typescript/lib/lib.d.ts path/to/example/node_modules/typescript/lib/lib.es5.d.ts path/to/example/node_modules/typescript/lib/lib.dom.d.ts path/to/example/node_modules/typescript/lib/lib.webworker.importscripts.d.ts path/to/example/node_modules/typescript/lib/lib.scripthost.d.ts path/to/example/index.ts

                                              請注意,如果您使用 TypeScript 4.2,請優先選擇 explainFiles,它也會說明為何新增檔案。

                                              # 追蹤解析度 - traceResolution

                                              當您嘗試除錯為何未包含模組時。您可以將 traceResolution 設為 true,讓 TypeScript 列印其對每個已處理檔案的解析度程序資訊。

                                              #專案

                                              # 複合 - composite

                                              composite 選項強制執行特定約束,讓建置工具(包括 TypeScript 本身,在 --build 模式下)能夠快速判斷專案是否已建置。

                                              當此設定開啟時

                                              • 若未明確設定 rootDir 設定,它會預設為包含 tsconfig.json 檔案的目錄。

                                              • 所有實作檔案都必須符合 include 模式或列在 files 陣列中。如果違反此約束,tsc 會通知您哪些檔案未指定。

                                              • declaration 預設為 true

                                              您可以在 手冊 中找到 TypeScript 專案的說明文件。

                                              # 停用參考專案載入 - disableReferencedProjectLoad

                                              在多專案 TypeScript 程式中,TypeScript 會將所有可用的專案載入記憶體中,以提供編輯器回應的準確結果,這些回應需要完整的知識圖表,例如「尋找所有參考」。

                                              如果您的專案很大,您可以使用旗標 disableReferencedProjectLoad 來停用自動載入所有專案。相反地,專案會在您透過編輯器開啟檔案時動態載入。

                                              # 停用解決方案搜尋 - disableSolutionSearching

                                              在使用 複合式 TypeScript 專案 時,這個選項提供一種方式來宣告您不希望在編輯器中使用「尋找所有參考」或「跳至定義」等功能時包含專案。

                                              這個旗標是您可以用來提升大型複合式專案回應速度的東西。

                                              # 停用來源專案參考重新導向 - disableSourceOfProjectReferenceRedirect

                                              在使用 複合式 TypeScript 專案 時,這個選項提供一種方式來 回到 3.7 之前的行為,其中 d.ts 檔案被用作模組之間的界線。在 3.7 中,真實來源現在是您的 TypeScript 檔案。

                                              # 增量 - incremental

                                              指示 TypeScript 將專案圖形中上次編譯的資訊儲存到儲存在磁碟上的檔案。這會在與編譯輸出相同的資料夾中建立一系列的 .tsbuildinfo 檔案。這些檔案不會在執行階段由 JavaScript 使用,可以安全地刪除。您可以在 3.4 發行說明 中進一步了解此旗標。

                                              若要控制要將檔案建置到哪些資料夾,請使用設定選項 tsBuildInfoFile

                                              # TS 建置資訊檔案 - tsBuildInfoFile

                                              這個設定讓您可以在複合專案中指定一個檔案來儲存漸進式編譯資訊,這有助於更快地建置較大的 TypeScript 程式碼庫。您可以在 手冊 中進一步了解複合專案。

                                              預設值取決於其他設定的組合

                                              • 如果設定了 outFile,預設值為 <outFile>.tsbuildinfo
                                              • 如果設定了 rootDiroutDir,則檔案為 <outDir>/<從 rootDir 到設定的相對路徑>/<設定名稱>.tsbuildinfo。例如,如果 rootDirsrcoutDirdest,而設定是 ./tsconfig.json,則預設值為 ./tsconfig.tsbuildinfo,因為從 src/./tsconfig.json 的相對路徑是 ../
                                              • 如果設定了 outDir,則預設值為 <outDir>/<設定名稱>.tsbuildInfo
                                              • 否則,預設值為 <設定名稱>.tsbuildInfo

                                              #輸出格式化

                                              #無錯誤截斷 - noErrorTruncation

                                              不要截斷錯誤訊息。

                                              使用 false,預設值。

                                              ts
                                              var x: {
                                              propertyWithAnExceedinglyLongName1: string;
                                              propertyWithAnExceedinglyLongName2: string;
                                              propertyWithAnExceedinglyLongName3: string;
                                              propertyWithAnExceedinglyLongName4: string;
                                              propertyWithAnExceedinglyLongName5: string;
                                              propertyWithAnExceedinglyLongName6: string;
                                              propertyWithAnExceedinglyLongName7: string;
                                              propertyWithAnExceedinglyLongName8: string;
                                              };
                                               
                                              // String representation of type of 'x' should be truncated in error message
                                              var s: string = x;
                                              Type '{ propertyWithAnExceedinglyLongName1: string; propertyWithAnExceedinglyLongName2: string; propertyWithAnExceedinglyLongName3: string; propertyWithAnExceedinglyLongName4: string; propertyWithAnExceedinglyLongName5: string; propertyWithAnExceedinglyLongName6: string; propertyWithAnExceedinglyLongName7: string; propert...' is not assignable to type 'string'.
                                              Variable 'x' is used before being assigned.
                                              2322
                                              2454
                                              Type '{ propertyWithAnExceedinglyLongName1: string; propertyWithAnExceedinglyLongName2: string; propertyWithAnExceedinglyLongName3: string; propertyWithAnExceedinglyLongName4: string; propertyWithAnExceedinglyLongName5: string; propertyWithAnExceedinglyLongName6: string; propertyWithAnExceedinglyLongName7: string; propert...' is not assignable to type 'string'.
                                              Variable 'x' is used before being assigned.
                                              Try

                                              使用 true

                                              ts
                                              var x: {
                                              propertyWithAnExceedinglyLongName1: string;
                                              propertyWithAnExceedinglyLongName2: string;
                                              propertyWithAnExceedinglyLongName3: string;
                                              propertyWithAnExceedinglyLongName4: string;
                                              propertyWithAnExceedinglyLongName5: string;
                                              propertyWithAnExceedinglyLongName6: string;
                                              propertyWithAnExceedinglyLongName7: string;
                                              propertyWithAnExceedinglyLongName8: string;
                                              };
                                               
                                              // String representation of type of 'x' should be truncated in error message
                                              var s: string = x;
                                              Type '{ propertyWithAnExceedinglyLongName1: string; propertyWithAnExceedinglyLongName2: string; propertyWithAnExceedinglyLongName3: string; propertyWithAnExceedinglyLongName4: string; propertyWithAnExceedinglyLongName5: string; propertyWithAnExceedinglyLongName6: string; propertyWithAnExceedinglyLongName7: string; propertyWithAnExceedinglyLongName8: string; }' is not assignable to type 'string'.
                                              Variable 'x' is used before being assigned.
                                              2322
                                              2454
                                              Type '{ propertyWithAnExceedinglyLongName1: string; propertyWithAnExceedinglyLongName2: string; propertyWithAnExceedinglyLongName3: string; propertyWithAnExceedinglyLongName4: string; propertyWithAnExceedinglyLongName5: string; propertyWithAnExceedinglyLongName6: string; propertyWithAnExceedinglyLongName7: string; propertyWithAnExceedinglyLongName8: string; }' is not assignable to type 'string'.
                                              Variable 'x' is used before being assigned.
                                              Try

                                                # 保留監控輸出 - preserveWatchOutput

                                                在監控模式下是否保留過時的控制台輸出,而不是每次變更時都清除畫面。

                                                • 內部

                                                # 美化 - pretty

                                                使用色彩和內容整理錯誤和訊息,這是預設開啟的狀態,讓您有機會從編譯器取得較不簡潔、單一色彩的訊息。

                                                • 預設

                                                  true

                                                #完整性

                                                #略過預設函式庫檢查 - skipDefaultLibCheck

                                                改用 skipLibCheck。略過預設函式庫宣告檔案的類型檢查。

                                                  #略過函式庫檢查 - skipLibCheck

                                                  略過宣告檔案的類型檢查。

                                                  這可以在編譯期間節省時間,但會犧牲類型系統的準確性。例如,兩個函式庫可能以不一致的方式定義兩個相同的 類型。TypeScript 不會完整檢查所有 d.ts 檔案,而是會檢查您在應用程式原始碼中特別引用的程式碼。

                                                  當你的 node_modules 中有兩個相同函式庫類型的副本時,你可能會考慮使用 skipLibCheck。在這種情況下,你應該考慮使用 yarn 的解析度 等功能,以確保你的樹狀結構中只有一個該依賴項的副本,或研究如何確保只有一個副本,藉由了解依賴項解析度來解決問題,而無需額外的工具。

                                                  另一個可能性是,當你在 TypeScript 版本之間進行遷移,而變更導致 node_modules 和 JS 標準函式庫中發生中斷,而你不想在 TypeScript 更新期間處理這些中斷時。

                                                  請注意,如果這些問題來自 TypeScript 標準函式庫,你可以使用 TypeScript 4.5 的 lib 替換 技術來替換函式庫。

                                                  • 建議
                                                  • 已發布

                                                    2.0

                                                  #指令行

                                                  #監控選項

                                                  TypeScript 3.8 提供了一個新的目錄監控策略,這對於有效地接收 node_modules 的變更至關重要。

                                                  在 Linux 等作業系統上,TypeScript 會在 node_modules 及其許多子目錄上安裝目錄監控器(與檔案監控器相對),以偵測依賴項的變更。這是因為可用檔案監控器的數量通常會被 node_modules 中的檔案數量所超越,而要追蹤的目錄數量卻少得多。

                                                  由於每個專案可能在不同的策略下運作得更好,而這個新方法可能不適用於你的工作流程,因此 TypeScript 3.8 引入了新的 watchOptions 欄位,使用戶可以告訴編譯器/語言服務應使用哪些監控策略來追蹤檔案和目錄。

                                                  # 假設變更只會影響直接相依關係 - assumeChangesOnlyAffectDirectDependencies

                                                  當啟用此選項時,TypeScript 將避免重新檢查/重新建置所有真正可能受影響的檔案,而只會重新檢查/重新建置已變更的檔案以及直接匯入這些檔案的檔案。

                                                  這可以視為監控演算法的「快速且鬆散」實作,它可以大幅縮短增量式重新建置時間,但代價是偶爾必須執行完整建置才能取得所有編譯器錯誤訊息。

                                                  監控選項

                                                  您可以設定 TypeScript --watch 的運作方式。本節主要用於處理 fs.watchfs.watchFile 在 Linux 等作業系統上具有額外限制的情況。您可以在 設定監控 中閱讀更多資訊。

                                                  # 監控檔案 - watchFile

                                                  個別檔案的監控策略。

                                                  • fixedPollingInterval:每隔固定時間間隔,每秒檢查檔案變更數次。
                                                  • priorityPollingInterval:每隔固定時間間隔,每秒檢查檔案變更數次,但使用啟發法來減少檢查特定類型檔案的頻率。
                                                  • dynamicPriorityPolling:使用動態佇列,其中較少修改的檔案將會較少被檢查。
                                                  • useFsEvents(預設):嘗試使用作業系統/檔案系統的原生事件來偵測檔案變更。
                                                  • useFsEventsOnParentDirectory:嘗試使用作業系統/檔案系統的原生事件來偵聽檔案父目錄的變更
                                                  • 允許
                                                    • fixedpollinginterval

                                                    • prioritypollinginterval

                                                    • dynamicprioritypolling

                                                    • fixedchunksizepolling

                                                    • usefsevents

                                                    • usefseventsonparentdirectory

                                                  • 已發布

                                                    3.8

                                                  # 監控目錄 - watchDirectory

                                                  在缺乏遞迴檔案監控功能的系統下,監控整個目錄樹的策略。

                                                  • fixedPollingInterval:以固定間隔每秒多次檢查每個目錄是否有變更。
                                                  • dynamicPriorityPolling:使用動態佇列,其中較少修改的目錄將較少被檢查。
                                                  • useFsEvents(預設):嘗試使用作業系統/檔案系統的原生事件來偵測目錄變更。
                                                  • 允許
                                                    • usefsevents

                                                    • fixedpollinginterval

                                                    • dynamicprioritypolling

                                                    • fixedchunksizepolling

                                                  • 已發布

                                                    3.8

                                                  # 回退輪詢 - fallbackPolling

                                                  在使用檔案系統事件時,此選項指定當系統用盡原生檔案監控器和/或不支援原生檔案監控器時所使用的輪詢策略。

                                                  • fixedPollingInterval:每隔固定時間間隔,每秒檢查檔案變更數次。
                                                  • priorityPollingInterval:每隔固定時間間隔,每秒檢查檔案變更數次,但使用啟發法來減少檢查特定類型檔案的頻率。
                                                  • dynamicPriorityPolling:使用動態佇列,其中較少修改的檔案將會較少被檢查。
                                                  • synchronousWatchDirectory:停用目錄的延遲監控。當大量檔案變更可能同時發生(例如執行 npm installnode_modules 的變更)時,延遲監控很有用,但您可能想使用此標記在一些較不常見的設定中停用它。
                                                  • 允許
                                                    • fixedinterval

                                                    • priorityinterval

                                                    • dynamicpriority

                                                    • fixedchunksize

                                                  • 已發布

                                                    3.8

                                                  # 同步監控目錄 - synchronousWatchDirectory

                                                  在原生不支援遞迴監控的平台上,同步呼叫回呼並更新目錄監控器的狀態。這會取代提供一個短暫的逾時,以允許檔案上可能發生多處編輯。

                                                  {
                                                  "watchOptions": {
                                                  }
                                                  }

                                                    # 排除目錄 - excludeDirectories

                                                    您可以在 --watch 期間使用 excludeFiles 來大幅減少監控的檔案數量。這是一個有用的方式,可以在 Linux 上減少 TypeScript 追蹤的開啟檔案數量。

                                                    {
                                                    "watchOptions": {
                                                    "": ["**/node_modules", "_build", "temp/*"]
                                                    }
                                                    }

                                                      # 排除檔案 - excludeFiles

                                                      您可以使用 excludeFiles 從監控的檔案中移除一組特定檔案。

                                                      {
                                                      "watchOptions": {
                                                      "": ["temp/file.ts"]
                                                      }
                                                      }

                                                        類型取得

                                                        類型取得僅對 JavaScript 專案很重要。在 TypeScript 專案中,您需要明確在專案中包含類型。不過,對於 JavaScript 專案,TypeScript 工具會在背景中和 node_modules 資料夾外下載模組的類型。

                                                        # 啟用 - enable

                                                        停用 JavaScript 專案中的自動類型取得

                                                        json
                                                        {
                                                        "typeAcquisition": {
                                                        "enable": false
                                                        }
                                                        }

                                                          # 包含 - include

                                                          如果您有 TypeScript 需要額外指導才能了解全域依賴項的 JavaScript 專案,或已透過 disableFilenameBasedTypeAcquisition 停用內建推論。

                                                          您可以使用 include 來指定應從 DefinitelyTyped 使用哪些類型

                                                          json
                                                          {
                                                          "typeAcquisition": {
                                                          "include": ["jquery"]
                                                          }
                                                          }

                                                          # 排除 - exclude

                                                          提供一個設定檔,用於停用 JavaScript 專案中特定模組的類型取得。這對在測試基礎架構中包含其他程式庫,而這些程式庫在主應用程式中不需要的專案很有用。

                                                          json
                                                          {
                                                          "typeAcquisition": {
                                                          "exclude": ["jest", "mocha"]
                                                          }
                                                          }

                                                          # 停用基於檔名的類型取得 - disableFilenameBasedTypeAcquisition

                                                          TypeScript 的類型取得可以根據專案中的檔名推論應新增哪些類型。這表示在專案中有一個像是 jquery.js 的檔案,會自動從 DefinitelyTyped 下載 JQuery 的類型。

                                                          您可以透過 disableFilenameBasedTypeAcquisition 停用這個功能。

                                                          json
                                                          {
                                                          "typeAcquisition": {
                                                          "disableFilenameBasedTypeAcquisition": true
                                                          }
                                                          }