2016-11-28 105 views

回答

9

這些是declaration files,或者有時它們在網絡上被稱爲definition files

我會用示例說明爲什麼需要這些文件。

假設,你有一個lib.js庫與f功能。

"use strict"; 
function f() { 
} 
exports.f = f; 

該庫可與其他js文件一起使用。例如。從main.js使用:

var f = require('./lib').f; 
f(); 

但要以打字稿發展,就需要使用此功能,所以在你的index.ts你寫了以下內容:

import {f} from './lib'; 

但打字稿編譯器會給你一個錯誤:

Error:(1, 17) TS2307:Cannot find module './lib'. 

這是因爲打字稿無法讀取js文件。所以你需要告訴打印機編譯器關於你的模塊和函數。當然,你不想重寫打字稿中的整個庫。但是有一個解決方案 - 聲明文件。您可以通過把創建的lib.js聲明文件中使用函數findex.ts以下爲lib.d.ts文件:

export declare function f(): void; 

現在都將正確編譯。如果您使用的是TypeScript,則可以通過tsconfig.json文件中的"declaration": true,tsc中的-d選項自動生成這些文件。

當您在打字稿編譯時間,而不是原來的.ts文件,如果需要他們

所以d.ts文件用於沿着他們的JavaScript同行(文件):

  • 你希望你的lib寫在JavaScript中供其他人使用 在TypeScript中寫入
  • 您想要使用JavaScript中編寫的lib 打字稿項目

有時候,兩者tsd.ts文件都可用,但開發商的動產僅暴露d.ts文件。這是angular2團隊爲其npm存儲庫選擇的方法。

+0

所以,據我所知,如果我正在開發打字稿庫,我不需要創建任何'.d.ts'文件,不是嗎? – Jordi

+1

如果你希望其他使用** javascript **而不是打字機的人來使用你的庫,你**需要提供'd.ts'文件。但正如我在我的回答中提到的那樣,您不需要編寫它們,它們將由打字機編譯器自動生成。 –

+0

可能是一個noob問題,但是「你希望你的用JavaScript編寫的lib被其他在TypeScript中編寫的用戶使用」與「如果你希望其他用JavaScript編寫而不是打字的用戶使用你的庫,你需要提供d.ts文件「。是否爲Typescript開發人員提供的聲明文件可以幫助他們消費第三方JS文件;主要以intellisense的形式出現,並且在你提供的優秀例子中? –

2

.ts是一個TypeScript代碼文件。 .d.ts是一個declaration file,通常用於定義非TypeScript API的類型(如DOM或jQuery)。

1

.d.ts文件通常表示類型定義文件。一般來說,對於已經存在於JavaScript中的庫,沒有打印源代碼。 .ts文件將成爲您的打字稿文件

1

d.ts文件僅包含各種現有JavaScript庫的函數,道具等的定義。 (代表絕對鍵入的腳本)

.ts文件是您在其上開發並轉換爲js文件的文件。 (代表鍵入的腳本)

1

.d.ts文件不能包含代碼,這會在編譯期間生成JavaScript代碼。它只是用於定義(通常是外部javascrip庫的定義)。例如,在.d.ts文件中沒有「聲明」修飾符的情況下定義「名稱空間」是錯誤的。