Deno 同時支持 JavaScript 和 TypeScript,它們是 Deno 的第一等語言。 這意味著它需要標準的模塊名稱,包括 擴展名(或提供正確媒體類型的服務(wù)器)。此外,Deno 還擁有“平凡”的模塊解析算法。導(dǎo)入模塊指定為文件(包括擴展名)或全限定 URL (fully qualified URL)。TypeScript 模塊可以被直接導(dǎo)入,例如:
import { Response } from "https://deno.land/std@0.53.0/http/server.ts";
import { queue } from "./collections.ts";
開箱即用的 TypeScript 編譯器依賴于兩種無擴展名 模塊和 Node.js 模塊解析邏輯,以將類型應(yīng)用于 JavaScript 模塊。 為了彌合這種差距,Deno 支持三種引用類型定義文件的方法,而不必求助于“魔法”的模塊解析。
如果您要導(dǎo)入 JavaScript 模塊,并且知道該模塊的類型定義在哪里,您可以在導(dǎo)入時指定類型定義。這采用編譯器提示的形式。編譯提示告訴 Deno .d.ts 文件的位置和與之相關(guān)的導(dǎo)入的 JavaScript 代碼。編譯提示指令是 @deno-types,當指定時,該值將在編譯器中使用,而不是 JavaScript 模塊。 例如,如果您有 foo.js,但您知道旁邊的 foo.d.ts 是該模塊的類型定義,代碼將像這樣:
// @deno-types="./foo.d.ts"
import * as foo from "./foo.js";
該值遵循與導(dǎo)入模塊相同的解析邏輯,這意味著它需要具有擴展名,并且是相對于當前模塊的。遠程模塊也可以使用該說明符。
此編譯提示影響下一個 import
語句,或是export ... from
語句,在編譯時,該值將替換模塊。像上面的示例一樣,Deno 編譯器將加載 ./foo.d.ts
,而不是./foo.js
。Deno 在運行時仍然會加載./foo.js
。
如果您要發(fā)布由 Deno 使用的模塊,并且想要告訴 Deno 類型定義的位置,您可以使用實際代碼中的三斜杠指令。 例如,如果您有一個 JavaScript 模塊,想為 Deno 提供類型定義的位置,您的 foo.js 可能看起來像這樣:
/// <reference types="./foo.d.ts" />
export const foo = "foo";
Deno 會看到這一點,并且在檢查類型時,編譯器將使用 foo.d.ts
文件,盡管foo.js
將在運行時加載。
該值遵循與導(dǎo)入模塊相同的解析邏輯,這意味著它需要具有擴展名,并且是相對于當前模塊的。遠程模塊也可以使用該說明符。
如果您要發(fā)布由 Deno 使用的模塊,并且想要告訴 Deno 類型定義的位置,您可以使用自定義 HTTP 頭 X-TypeScript-Types
,來告訴 Deno 文件位置。
標頭的工作方式與上述三斜杠參考相同,這只是意味著 JavaScript 文件本身的內(nèi)容不需要修改后,并且類型定義的位置可以通過服務(wù)器本身確定。
不是所有類型定義都受支持
Deno 將使用編譯提示來加載指示的 .d.ts 文件,但有些 .d.ts 文件包含不受支持的功能。具體來說,有些 .d.ts 文件期望能夠從其他包中加載或引用類型定義,它們使用模塊解析邏輯。
例如,一個包含 node 的類型引用指令,希望解析為像 ./node_modules/@types/node/index
.d.ts 的某些路徑。由于這取決于非相對性的模塊解析算法,Deno 無法處理這種情況。
TypeScript 編譯器支持三斜杠指令,包括類型 參考指令。如果 Deno 使用此功能,則會干擾 TypeScript 編譯器。Deno 僅在 JavaScript (包括 JSX)文件中查找指令。
在 Deno 生態(tài)系統(tǒng)中,所有嚴格標志都被默認啟用,以符合 TypeScript 的理想狀態(tài)。Deno 也支持自定義配置文件,例如 tsconfig.json。 您需要通過顯式設(shè)置 -c 或 --config 選項,來明確告訴 Deno 在哪里尋找此配置。 deno run -c tsconfig.json mod.ts 以下是 Deno 當前允許的設(shè)置及其默認值:
{
"compilerOptions": {
"allowJs": false,
"allowUmdGlobalAccess": false,
"allowUnreachableCode": false,
"allowUnusedLabels": false,
"alwaysStrict": true,
"assumeChangesOnlyAffectDirectDependencies": false,
"checkJs": false,
"disableSizeLimit": false,
"generateCpuProfile": "profile.cpuprofile",
"jsx": "react",
"jsxFactory": "React.createElement",
"lib": [],
"noFallthroughCasesInSwitch": false,
"noImplicitAny": true,
"noImplicitReturns": true,
"noImplicitThis": true,
"noImplicitUseStrict": false,
"noStrictGenericChecks": false,
"noUnusedLocals": false,
"noUnusedParameters": false,
"preserveConstEnums": false,
"removeComments": false,
"resolveJsonModule": true,
"strict": true,
"strictBindCallApply": true,
"strictFunctionTypes": true,
"strictNullChecks": true,
"strictPropertyInitialization": true,
"suppressExcessPropertyErrors": false,
"suppressImplicitAnyIndexErrors": false,
"useDefineForClassFields": false
}
}
有關(guān)上述選項和用例的文檔,請訪問 typescript docs. 注意:以上列表中不包含 Deno 不支持的選項,或者 TypeScript 文檔中已經(jīng)標記為廢棄的/實驗性的選項。
更多建議: