Typescript 聲明文件 .d.ts

當使用第三方庫時,需要引用它的聲明文件掏膏,才能獲知其數(shù)據(jù)類型,以獲得對應的代碼補全敦锌、接口提示等功能馒疹。
聲明文件用于定義類型而非具體的值,不會保留在編譯結果的 js 中乙墙。

TS編譯檢查時颖变,變量的聲明查找順序
  1. 當前編譯上下文找該變量的定義
  2. 變量所在模塊的index.d.ts聲明文件中查找(或其package.jsontypes字段指向文件)
    通常由npm包的維護者提供
  3. node_modules/@types/npm包名 查找聲明
    通常是作者沒有提供聲明文件,由社區(qū)其他開發(fā)者提供听想,以@types/開頭的聲明文件悼做,如:npm install @types/jquery
  4. 通過配置文件 tsconfig.json 中的 pathsbaseUrl 字段指向的其他目錄
    通常是自己本地寫的聲明文件

生成 .d.ts 文件

tsc指令中添加 --declaration(簡寫 -d),或者在 tsconfig.json 中添加 declaration 選項哗魂,就可以同時也生成 .d.ts 聲明文件了。

{
    "compilerOptions": {
        "module": "commonjs",
        "outDir": "lib",
        "declaration": true,
    }
}

全局變量聲明

在script模式中漓雅,通過declare進行全局變量聲明录别,通過script標簽引入,全局生效邻吞。
注意全局變量文件中不能有import组题、export關鍵字,否則會被視為npm/UMD包文件抱冷。

type 和 interface

兩者本來就只是類型的定義崔列,因此不需搭配declare關鍵字,直接在聲明文件中使用
為了防止命名沖突旺遮,通常放在namespace

聲明全局變量
declare var jQuery: (selector: string) => any;
declare let jQuery: (selector: string) => any;
declare const jQuery: (selector: string) => any;
聲明函數(shù)

支持函數(shù)重載

declare function jQuery(selector: string): any;
declare function jQuery(domReadyCallback: () => any): any;
聲明類

注意 declare 里可以聲明類的構造函數(shù)赵讯,interface 里不可以

declare class Animal {
    name: string;
    constructor(name: string);
    sayHi(): string;
}
聲明枚舉
declare enum Directions {
    Up,
    Down,
    Left,
    Right
}
聲明命名空間

命名空間(namespace)是TS自己的模塊化方案,隨著ES6的module廣泛運用耿眉,已不推薦使用边翼。不同于ES6的module,一個文件里可以有多個namespace鸣剪。
目前通常在聲明文件中使用组底,表示一個對象中具有很多子屬性丈积。
通過命名空間.屬性來調(diào)用內(nèi)部屬性。

declare namespace jQuery {
    function ajax(url: string, settings?: any): void;
    const version: number;
    class Event {
        blur(eventType: EventType): void
    }
    enum EventType {
        CustomClick
    }
}

命名空間也可以嵌套

// src/jQuery.d.ts
declare namespace jQuery {
    function ajax(url: string, settings?: any): void;
    namespace fn {
        function extend(object: any): void;
    }
}
//或
declare namespace jQuery.fn {
    function extend(object: any): void;
}

// src/index.ts
jQuery.ajax('/api/get_something');
jQuery.fn.extend({
    check: function() {
        return this.each(function() {
            this.checked = true;
        });
    }
});
聲明合并

同名變量可以重復聲明债鸡,表示有不同的形狀

declare function jQuery(selector: string): any;
declare namespace jQuery {
    function ajax(url: string, settings?: any): void;
}

通過聲明合并江滨,還可以為系統(tǒng)變量添加新屬性,稱為擴展全局變量

interface String {
    prependHello(): string;
}

模塊聲明

npm包(ES6)規(guī)范的聲明

.d.ts文件中厌均,如存在export唬滑,則為一個模塊聲明文件,npm包中即使用該方式莫秆。
在模塊聲明中间雀,只有export導出 + import導入的聲明,才會生效镊屎。

可以對每個變量分別export惹挟,也可以用declare分別聲明,并統(tǒng)一export(注意缝驳,同全局變量聲明文件连锯,type 和 interface 不需要 declare)

// types/foo/index.d.ts
export const name: string;
export interface Options {
    data: any;
}

// types/foo/index.d.ts
declare const name: string;
interface Options {
    data: any;
}
export { name, Options };

// src/index.ts
import { name, Options } from 'foo';
console.log(name);
let options: Options = {
    data: {
        name: 'foo'
    }
};
commonjs 規(guī)范的聲明

ts中,對采用commonjs規(guī)范的庫用狱,可以通過以下方式導入:

  • commonjs語法:
const foo = require('foo');
const bar = require('foo').bar;
  • ESM語法:
import * as foo from 'foo';
import { bar } from 'foo';
  • TS新增語法import + requireexport =搭配使用:
// types/foo/index.d.ts
export = foo;
declare function foo(): string;
declare namespace foo {
    const bar: number;
}


// 整體導入
import foo = require('foo');
import * as foo from 'foo';
import foo from 'foo';//當啟用allowSyntheticDefaultImports時

// 單個導入
import bar = foo.bar;
UMD規(guī)范的聲明

既可以通過 <script> 標簽引入运怖,又可以通過 import 導入的庫,需要通過export as namespace將聲明好的一個變量聲明為全局變量

// types/foo/index.d.ts

export as namespace foo;
export = foo;

declare function foo(): string;
declare namespace foo {
    const bar: number;
}
直接擴展全局變量

有的第三方庫擴展了一個全局變量夏伊,可是此全局變量的類型卻沒有相應的更新過來摇展,就會導致 ts 編譯錯誤,此時就需要擴展全局變量的類型溺忧。
注意聲明文件仍然需要導出一個空對象咏连,用來告訴編譯器這是一個模塊的聲明文件

// types/foo/index.d.ts

declare global {
    //通過聲明合并,給 String 添加屬性或方法鲁森。
    interface String {
        prependHello(): string;
    }
}

export {};

// src/index.ts

'bar'.prependHello();
模塊插件

declare module可用于在一個文件中一次性聲明多個模塊的類型祟滴,或擴展某模塊類型

// types/moment-plugin/index.d.ts
import * as moment from 'moment';

declare module 'moment' {
    export function foo(): moment.CalendarKey;
}

// src/index.ts
import * as moment from 'moment';
import 'moment-plugin';

moment.foo();
三斜線指令

類似于聲明文件中的 import,它可以用來導入另一個聲明文件歌溉。
三斜線指令必須放在文件的最頂端垄懂,三斜線指令的前面只允許出現(xiàn)單行或多行注釋。
當且僅當在以下幾個場景下痛垛,我們才需要使用三斜線指令替代 import:

  • 當我們在書寫一個全局變量的聲明文件時(避免出現(xiàn)import草慧、export關鍵字,以免被識別為npm榜晦、UMD文件)
// types/jquery-plugin/index.d.ts

/// <reference types="jquery" />

declare function foo(options: JQuery.AjaxSettings): string;


// src/index.ts

foo({});
  • 當我們需要依賴一個全局變量的聲明文件時
    由于全局變量不支持通過 import 導入冠蒋,當然也就必須使用三斜線指令來引入了
// types/node-plugin/index.d.ts

/// <reference types="node" />

export function foo(p: NodeJS.Process): string;


// src/index.ts

import { foo } from 'node-plugin';

foo(global.process);
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市乾胶,隨后出現(xiàn)的幾起案子抖剿,更是在濱河造成了極大的恐慌朽寞,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斩郎,死亡現(xiàn)場離奇詭異脑融,居然都是意外死亡,警方通過查閱死者的電腦和手機缩宜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門肘迎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人锻煌,你說我怎么就攤上這事妓布。” “怎么了宋梧?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵匣沼,是天一觀的道長。 經(jīng)常有香客問我捂龄,道長释涛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任倦沧,我火速辦了婚禮唇撬,結果婚禮上,老公的妹妹穿的比我還像新娘展融。我一直安慰自己窖认,他們只是感情好,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布告希。 她就那樣靜靜地躺著耀态,像睡著了一般。 火紅的嫁衣襯著肌膚如雪暂雹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天创夜,我揣著相機與錄音杭跪,去河邊找鬼。 笑死驰吓,一個胖子當著我的面吹牛涧尿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播檬贰,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼姑廉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了翁涤?” 一聲冷哼從身側(cè)響起桥言,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤萌踱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后号阿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體并鸵,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年扔涧,在試婚紗的時候發(fā)現(xiàn)自己被綠了园担。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡枯夜,死狀恐怖弯汰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情湖雹,我是刑警寧澤咏闪,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站劝枣,受9級特大地震影響汤踏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜舔腾,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一溪胶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧稳诚,春花似錦哗脖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至氨距,卻和暖如春桑逝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背俏让。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工楞遏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人首昔。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓寡喝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親勒奇。 傳聞我的和親對象是個殘疾皇子预鬓,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 看到別人寫ts文件的時候,通常會有以.d.ts結尾的文件跟著赊颠,它的作用是格二,描述Javascript模板內(nèi)導出的接口...
    Adder閱讀 8,392評論 0 6
  • 聲明文件中劈彪,declare 表示聲明的意思js原有類型必須加declare,js不存在的類型不用加蟋定,如:inter...
    wyc0859閱讀 7,496評論 0 1
  • 本文摘自 https://ts.xcatliu.com/basics/declaration-files 聲明文件...
    Lia代碼豬崽閱讀 906評論 0 1
  • 點擊原文 now我們來看一看TS怎么聲明文件粉臊, 在JS里面我們經(jīng)常會使用各種第三方類庫,引入方式也不太相同驶兜,常見的...
    videring閱讀 3,125評論 0 4
  • 當使用第三方庫時扼仲,我們需要引用它的聲明文件,才能獲得對應的代碼補全抄淑、接口提示等功能屠凶。這是因為前端第三方庫大多都是非...
    CondorHero閱讀 4,901評論 1 5