TS 的三斜線指令

Triple-Slash Directives.png

三斜線指令很簡單友鼻,推薦大家去看官網(wǎng) triple-slash-directives舱污。

我在這主要講下三斜線指令的實踐應用话浇。

重點:我們知道在 TS 項目中抄沮,文件之間相互引用是通過 import 來實現(xiàn)的跋核,那么聲明文件之間的引用呢?沒錯通過三斜線指令叛买。

三斜線指令常用的就兩個功能:

  1. 倒入聲明文件
  2. 倒入第三方包

如果對比 import 的功能砂代,我們可以寫出如下的等式:

  • /// <reference path="..." /> == import filename.xxx
  • /// <reference types="..." /> == import lodash from "lodash"

demo 就不寫了,直接分析下 Create-React-App 關(guān)于三斜線指令的用法率挣,熟練掌握這個刻伊,基本就算精通了。

Create-React-App 創(chuàng)建的 TS 項目椒功,src 目錄下會有一個文件 react-app-env.d.ts 捶箱,打開它,很簡單就一行代碼动漾。

/// <reference types="react-scripts" />

聲明文件丁屎,引用了一個第三方的聲明文件包 react-scripts。問題來了旱眯, 我們?nèi)ツ恼宜爻看ǎ繘]錯也在 node_modules 里面找,reference types 的索引規(guī)則删豺,完全不知道在哪去找共虑, 經(jīng)過的我實驗,知道了它的索引規(guī)則為:

  1. node_modules/@types/react-scripts/index.d.ts
  2. node_modules/@types/react-scripts/package.json 的 types 字段
  3. node_modules/react-scripts/index.d.ts
  4. node_modules/react-scripts/package.json 的 types 字段
  5. 接下里就是 NodeJs 查找模塊的套路了

Create-React-App 的 react-scripts 包呀页,就在 node_modules/react-scripts 里面妈拌,打開 react-scripts/package.json 的 types 字段指定的聲明文件 index.d.ts 內(nèi)容如下。

這個文件很簡單蓬蝶,頭部繼續(xù)索引了三個聲明文件供炎,剩下的代碼大部分都是對非靜態(tài)文件的聲明晶姊。

/// <reference types="node" />
/// <reference types="react" />
/// <reference types="react-dom" />

declare namespace NodeJS {
  interface ProcessEnv {
    readonly NODE_ENV: 'development' | 'production' | 'test';
    readonly PUBLIC_URL: string;
  }
}

declare module '*.avif' {
  const src: string;
  export default src;
}

declare module '*.bmp' {
  const src: string;
  export default src;
}

declare module '*.gif' {
  const src: string;
  export default src;
}

declare module '*.jpg' {
  const src: string;
  export default src;
}

declare module '*.jpeg' {
  const src: string;
  export default src;
}

declare module '*.png' {
  const src: string;
  export default src;
}

declare module '*.webp' {
    const src: string;
    export default src;
}

declare module '*.svg' {
  import * as React from 'react';

  export const ReactComponent: React.FunctionComponent<React.SVGProps<
    SVGSVGElement
  > & { title?: string }>;

  const src: string;
  export default src;
}

declare module '*.module.css' {
  const classes: { readonly [key: string]: string };
  export default classes;
}

declare module '*.module.scss' {
  const classes: { readonly [key: string]: string };
  export default classes;
}

declare module '*.module.sass' {
  const classes: { readonly [key: string]: string };
  export default classes;
}

上面是三斜線引用第三方聲明文件的寫法,我們見識到了 types 的用法坦康,接下來我們見識下引用自己寫聲明文件的用法——path揖赴。

仔細觀察 react-scripts 的聲明文件,都是關(guān)于圖片的聲明竭钝,沒有關(guān)于視頻文件 video 的聲明梨撞,在項目中如果通過 Video 標簽引入視頻,過不了 TS 的檢查香罐,會直接報錯卧波,所以我們來寫下視頻文件的聲明,順道看下 path 的作用庇茫。

我們現(xiàn)在 react-app-env.d.ts 聲明文件所在目錄港粱,新建文件聲明文件 video.d.ts,其內(nèi)容很簡單旦签,如下:

declare module "*.mp4";

我們在 react-app-env.d.ts 聲明文件中通過三斜線指令引入:

/// <reference types="react-scripts" />
/// <reference path="./video" />

此時在項目中插入一個視頻標簽:

import React from 'react';
import macaque from "./macaque.mp4";
function App() {
  return <video controls width={400} autoPlay src={macaque}></video>;
};

export default App;

完美運行查坪,且控制臺沒有報錯:

我們還可以驗證下,注釋掉 video.d.ts 的內(nèi)容宁炫,我們會看到組件報錯如下:

Cannot find module './macaque.mp4' or its corresponding type declarations.

好了偿曙,三斜線指令掌握到此完全闊以了,接下來學二送一羔巢。

三斜線指令的作用是用來引用聲明文件望忆,這時候我們可以想想,項目中還有誰有聲明文件竿秆,沒錯 TS 本身启摄。我們來實驗下,就用 ES2019 的 flat 方法幽钢。

首先確定 tsconfig.json 的 lib 字段不要出現(xiàn) ES2019歉备、ES2020 或 ESNEXT

{
  "compilerOptions": {
    "lib": [
      "dom",
      "dom.iterable"
    ]
  },
  "include": [
    "src"
  ]
}

這時候我們在組件中使用下數(shù)組的 flat 方法:

import React from 'react';

function App() {
  const arr = [[1, 2], [3, 4], [5, 6]];
  console.log(arr.flat());
  return <h3>ES2019 的 flat 方法演示</h3>;
}

export default App;

因為沒有引入 ES2019+搅吁,所以會過不了 TS 的檢查威创,錯誤如下:

Do you need to change your target library? Try changing the `lib` compiler option to 'es2019' or later.

常用的解決辦法,VSCode 都給我們提示出來了谎懦,在 lib 添加 ES2019+肚豺。我們現(xiàn)在不能這么做因為我們要觀察三斜線指令引入 TS 自帶的聲明文件。

那怎么使用三斜線指定解決這個問題呢界拦?灰常簡單吸申,頭部添加一行注釋即可。

/// <reference lib="es2019.array" />
import React from 'react';

function App() {
  const arr = [[1, 2], [3, 4], [5, 6]];
  console.log(arr.flat());
  return <h3>ES2019 的 flat 方法演示</h3>;
}

export default App;

現(xiàn)在看下 VSCode ,嗯截碴,錯誤消失了梳侨。

這是三斜線指令的另一個用法,引入 lib 內(nèi)置的聲明文件日丹,但是我們不用走哺,因為我們項目都是在 tsconfig.json 里面直接配置好的,好嗎哲虾。

使用注意事項

三斜線使用注意

  • 必須放在文件的最頂部
  • 三斜線前面只能出現(xiàn)丙躏,單行注釋或多行注釋

完~

當前時間 Friday, April 30, 2021 11:39:03

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市束凑,隨后出現(xiàn)的幾起案子晒旅,更是在濱河造成了極大的恐慌,老刑警劉巖汪诉,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件废恋,死亡現(xiàn)場離奇詭異,居然都是意外死亡扒寄,警方通過查閱死者的電腦和手機鱼鼓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旗们,“玉大人蚓哩,你說我怎么就攤上這事构灸∩峡剩” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵喜颁,是天一觀的道長稠氮。 經(jīng)常有香客問我,道長半开,這世上最難降的妖魔是什么隔披? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮寂拆,結(jié)果婚禮上奢米,老公的妹妹穿的比我還像新娘。我一直安慰自己纠永,他們只是感情好鬓长,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著尝江,像睡著了一般涉波。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天啤覆,我揣著相機與錄音苍日,去河邊找鬼。 笑死窗声,一個胖子當著我的面吹牛相恃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播笨觅,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼豆茫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了屋摇?” 一聲冷哼從身側(cè)響起揩魂,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎炮温,沒想到半個月后火脉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡柒啤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年倦挂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片担巩。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡方援,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出涛癌,到底是詐尸還是另有隱情犯戏,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布拳话,位于F島的核電站先匪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏弃衍。R本人自食惡果不足惜呀非,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望镜盯。 院中可真熱鬧岸裙,春花似錦、人聲如沸速缆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽激涤。三九已至拟糕,卻和暖如春判呕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背送滞。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工侠草, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人犁嗅。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓边涕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親褂微。 傳聞我的和親對象是個殘疾皇子功蜓,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

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