<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          TypeScript 聲明文件全解析

          共 4044字,需瀏覽 9分鐘

           ·

          2021-06-19 12:53

          導(dǎo)語:全面擁抱 TS 的時代,TS 已經(jīng)成為日常開發(fā)中的重要部分。本文主要介紹 TS 聲明文件的寫法。

          聲明文件的定義

          通俗地來講,在 TypeScript 中以 .d.ts 為后綴的文件,我們稱之為 TypeScript 聲明文件。它的主要作用是描述 JavaScript 模塊內(nèi)所有導(dǎo)出接口的類型信息。

          什么時候需要寫 TS 聲明文件

          在日常的開發(fā)中,絕大多數(shù)時候是不需要我們單獨(dú)去編寫一個 TS 聲明文件的。如果我們的文件本身是用 TS 編寫的,在編譯的時候讓 TS 自動生成聲明文件,并在發(fā)布的時候?qū)?span style="color: rgb(0, 0, 0);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 14px;text-align: left;background-color: rgb(255, 255, 255);"> .d.ts 文件一起發(fā)布即可。

          總結(jié)了以下三種情況,需要我們手動定義聲明文件:

          1. 通過 script 標(biāo)簽引入的第三方庫

          一些通過 CDN 的當(dāng)時映入的小的工具包,掛載了一些全局的方法,如果在 TS 中直接使用的話,會報 TS 語法錯誤,這時候就需要我們對這些全局的方法進(jìn)行 TS 聲明。

          1. 使用的第三方 npm 包,但是沒有提供聲明文件

          第三方 npm 包如果有提供聲明文件的話,一般會以兩種形式存在:一是 @types/xxx,另外是在源代碼中提供 .d.ts 聲明文件。第一種的話一般是一些使用量比較高的庫會提供,可以通過 npm i @type/xxx 嘗試安裝。如果這兩種都不存在的話,那就需要我們自己來定義了。

          1. 自身團(tuán)隊(duì)內(nèi)比較優(yōu)秀的 JS 庫或插件,為了提升開發(fā)體驗(yàn)

          如何編寫 TS 聲明文件

          對于不同形式的聲明文件,寫法上會有一定的差異。這里需要特別注意一點(diǎn)的是:聲明文件中只是對類型的定義,不能進(jìn)行賦值

          ?? 全局變量

          全局變量的聲明文件主要有以下幾種語法:

          declare let/const  // 聲明全局變量
          declare function   // 聲明全局方法
          declare class      // 聲明全局類
          declare enum       // 聲明全局枚舉類型 
          declare namespace  // 聲明(含有子屬性的)全局對象
          interface/type     // 聲明全局類型

          這里需要注意的是只是定義類型,不能進(jìn)行賦值

          // 變量
          declare let userName: string;

          declare const wx: any;

          // 函數(shù)、函數(shù)重載
          declare function getName(uid: number): string;
          declare function getName(): string;
          declare function getName(cb: () => any): any;

          // 類
          declare class Course 
          {
            cid: number;
            constructor(cid){};
            getCoursePrice(): number;
          }

          // 枚舉
          declare enum Status {
            Loading,
            Success,
            Failed,
          }

          // 接口 interface declare 可以不需要
          interface CourseInfo {
            cid: number;
            name: string;
          }

          interface CGIData<T> {
            data: T;
            retcode: 0;
          }

          // 命名空間
          declare namespace User {
            // 局部 Test.User
            interface User {
              name: string;
              age: number;
            }

            function getUserInfo(name: string): User {
              return "";
            }
            namespace fn {
              function extend(obj: any): any;
            }
          }


          // 聲明合并
          declare function User(id: number): string;

          ?? npm 包

          對于沒有提供聲明文件的 npm 包,我們可以創(chuàng)建一個 types 目錄,來管理自己寫的聲明文件,同時需要在配置文件 tsconfig.json 中的 paths 和 basrUrl 中配置:

          {
            "compilerOptions": {
              "module""commonjs",
              "baseUrl""./"// types文件夾的相對路徑
              "paths": { "*": ["types/*"]}
            }
          }

          npm 包的聲明文件主要有以下幾種語法:

          export const/let  // 導(dǎo)出變量
          export namespace  // 導(dǎo)出(含有自屬性的)對象
          export default    // ES6 默認(rèn)導(dǎo)出
          export =          // commonjs 導(dǎo)出模塊

          ?? 拓展原有模塊/全局變量

          對于已經(jīng)有聲明定義的模塊或者全局變量,可以利用 TS 中的聲明合并對其進(jìn)行拓展。

          比如在 window 下掛載的一些全局變量:

          interface Window {
            readonly request?: any;
            readonly devToolsExtension?: any;
            readonly wx?: any;
          }

          對已有模塊進(jìn)行拓展:

          declare module "querystring" {
            function escape(str: string): string;
            function unescape(str: string): string;
          }

          還可以使用三斜線的方式對聲明文件進(jìn)行引用:

          /// <reference path=”custom.d.ts" />

          最后

          如何讓 TS 在編譯時自動生成 .d.ts 文件呢?只需要在 tsconfig.json 配置文件中開啟即可,TS 編譯時就會自動生成 .d.ts 聲明文件:

          {
            "compilerOptions": {
              "declaration"true
            }
          }

          參考

          TypeScript入門教程–聲明文件

          愛心三連擊

          1.看到這里了就點(diǎn)個在看支持下吧,你的在看是我創(chuàng)作的動力。

          2.關(guān)注公眾號腦洞前端,獲取更多前端硬核文章!加個星標(biāo),不錯過每一條成長的機(jī)會。

          3.如果你覺得本文的內(nèi)容對你有幫助,就幫我轉(zhuǎn)發(fā)一下吧。

          瀏覽 58
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产九九九九 | 日韩无码视频网 | guochankaobishipin | 大香蕉国产精品 | 人人操手机观看 |