精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

TypeScript 深水區:三種類型來源和三種模塊語法

開發 前端
深入掌握 TypeScript 的話,除了學習類型定義以及類型編程,這三種類型聲明的來源(lib、@types、用戶目錄),以及三種模塊聲明的方式(namespace、module、es module),還有全局類型的聲明(global、reference),也都是要掌握的。

TypeScript 給 JavaScript 添加了一套類型語法,我們聲明變量的時候可以給變量加上類型信息,這樣編譯階段就可以檢查出變量使用的對不對,也就是類型檢查。

給變量添加類型,很自然可以想到時在聲明的時候指定:

比如對象:

interface Person {
name: string;
age?: number;
}

const guang: Person = {
name: 'guang'
}

比如函數:

function add(num1: number, num2: number): number {
return num1 + num2;
}

這樣當使用它們的時候,比如變量賦值、函數調用,就可以通過類型信息檢查出使用的對不對:

圖片

圖片

TypeScript 這樣設計類型語法沒啥問題,但是只是這樣還不夠。

我們自己寫的代碼可以這樣聲明類型,但不是我們寫的呢?

比如 JS 引擎提供的 Number、String、Date、RegExp,瀏覽器環境的 HTMLElement、Event 等 api。

這些 api 是執行引擎內置的實現,但我們代碼里會用到它們,也同樣需要檢查使用的對不對,也就是類型檢查。怎么給這些 api 加上類型呢?

TypeScript 類型聲明的三種來源

TypeScript 設計了 declare 的語法,可以單獨聲明變量的類型:

比如對象:

interface Person {
name: string;
age?: number;
}

declare const guang: Person;

比如函數:

declare function add(num1: number, num2: number): number;

這樣單獨聲明了類型,使用這些 api 的時候也就能做類型檢查。

像 JS 引擎那些 api,還有瀏覽器提供的 api,這些基本是必用的,而且都有標準的。所以 TypeScript 給內置了它們的類型聲明。

TypeScript 包下有個 lib 目錄,里面有一堆 lib.xx.d.ts 的類型聲明文件,這就是 TS 內置的一些類型聲明。

圖片

圖片

因為這些只是聲明類型,而沒有具體的 JS 實現,TS 就給單獨設計了一種文件類型,也就是 d.ts, d 是 declare 的意思。

比如 lib.dom.d.ts 里的類型聲明:

圖片

因為是 ts 內置的,所以配置一下就可以用了:

圖片

tsconfig.json 里配置下 compilerOptions.lib,就可以引入對應的 d.ts 的類型聲明文件。

有的同學可能會說,可是內置的類型聲明也不多呀,只有 dom 和 es 的。

確實,因為 JS 的 api 還有瀏覽器的 api 都是有標準的,那自然可以按照標準來定義類型。其余的環境的 api 可能沒有標準,經常變,那自然就沒法內置了,比如 node。所以 lib 里只有 dom 和 es 的類型聲明。

那 node 環境,還有其他環境里的內置 api 怎么配置類型聲明呢?

node 等環境的 api 因為沒有標準而沒有被 TS 內置,但 TS 同樣也支持了這些環境的類型聲明的配置。

方式是通過 @types/xxx 的包:

圖片

TS 會先加載內置的 lib 的類型聲明,然后再去查找 @types 包下的類型聲明。

這樣,其他環境的類型聲明就可以通過這種方式來擴展。

圖片

@types 包是在 DefinitelyTyped 這個項目下統一管理的,想創建一個 @types 包的話要去看一下他們的文檔。

圖片

一般來說,很快就可以發到 npm 的:

圖片

我們知道,TS 內置的那些 lib 是可以配置的,擴展的這些 @types/xx 的包自然也可以配置:

圖片

可以指定加載 @types 目錄下的哪些包,還可以修改查找 @types 包的目錄(默認是 node_modules/@types):

圖片

除了給 node 等環境的 api 加上類型聲明外,@types 包還有一種用途,就是給一些 JS 的包加上類型聲明:

如果代碼本身是用 ts 寫的,那編譯的時候就可以開啟 compilerOptions.declaration,來生成 d.ts 文件:

圖片

然后在 package.json 里配置 types 來指定 dts 的位置:

圖片

這樣就不需要單獨的 @types 包了。

但如果代碼不是用 ts 寫的,那可能既需要單獨寫一個 @types/xxx 的包來聲明 ts 類型,然后在 tsconfig.json 里配置下,加載進來。

比如常用的 vue3 就不需要 @types/vue 包,因為本身是用 ts 寫的,npm 包里也包含了 dts 文件。

但是 react 不是 ts 寫的,是用的 facebook 自己的 flow,自然就需要 @types/react 的包來加上 ts 類型聲明。

至此,ts 內置的 dom 和 es 的類型聲明,其他環境還有一些包的類型聲明我們都知道怎么加載了。

那自己寫的 ts 代碼呢?

這些其實我們經常配置,就是配置下編譯的入口文件,通過 includes 指定一堆,然后通過 excludes 去掉一部分。還可以通過 files 再單獨包含一些:

圖片

tsc 在編譯的時候,會分別加載 lib 的,@types 下的,還有 include 和 files 的文件,進行類型檢查。

這就是 ts 類型聲明的三種來源。

現在還有一個問題,有的 api 是全局的,有的 api 是某個模塊的,ts 是怎么聲明全局 api 的類型,怎么聲明模塊內的 api 的類型呢?

全局類型聲明 vs 模塊類型聲明

我們寫的 JS 代碼就是有的 api 是全局的,有的 api 是模塊內的,所以 TS 需要支持這個也很正常。

但 JS 的模塊規范不是一開始就有的,最開始是通過在全局掛一個對象,然后這個對象上再掛一些 api 的方式,也就是命名空間 namespace。

所以 TS 最早支持的模塊化方案自然也就是 namespace:

namespace Guang {
export interface Person {
name: string;
age?: number;
}

const name = 'guang';
const age = 20;

export const guang: Person = {
name,
age
}
export function add(a: number, b: number):number {
return a + b;
}
}

理解 namespace 的話可以看一下編譯后的代碼:

圖片

就是全局上放一個對象,然后對象上再掛幾個暴露出去的屬性。

看了編譯后的代碼,是不是 namespace 瞬間就學會了~

后來,出現了 CommonJS 的規范,那種不能叫 namespace 了,所以 TS 支持了 module,

很容易想到,@types/node 的 api 定義就是一堆的 module:

圖片

這個 module 和 namespace 有什么區別呢?

其實真沒什么區別,只不過 module 后一般接一個路徑,而 namespace 后一半是一個命名空間名字。其他的語法都一樣的。

而且這個結論是有依據的:

圖片

圖片

用 astexplorer.net 看一下 parse 后的 AST,兩者的 AST類型都是一樣的。也就是說編譯器后續的處理都一樣,那不是一種東西是什么。

再后來的故事大家都知道了,JS 有了 es module 規范,所以現在推薦直接用 import export 的方式來聲明模塊和導入導出了。

額外多了的,只不過有一個 import type 的語法,可以單獨引入類型:

import type {xxx} from 'yyy';

所以現在聲明模塊不咋推薦用 namespace 和 module,還是盡量用 es module 吧。

那全局的類型聲明呢?

有了 es module 之后,TS 有了一個單獨的設計:

dts 中,如果沒有 import、export 語法,那所有的類型聲明都是全局的,否則是模塊內的。

我們試驗一下:

include 配置 src 下的 ts 文件,然后再用 files 引入 global.d.ts 文件:

圖片

在 global.d.ts 里聲明一個 func 函數:

圖片

在 src/index.ts 里是有提示的:

圖片

編譯也不報錯:

圖片

加上一個 import 語句:

圖片

編譯就報錯了,說是找不到 func:

圖片

這說明 func 就不再是全局的類型了。

這時候可以手動 declare global:

圖片

再試一下,編譯就通過了:

圖片

而且不止是 es module 的模塊里可以用 global 聲明全局類型,module 的方式聲明的 CommonJS 模塊也是可以的:

比如 @types/node 里就有不少這種全局類型聲明:

圖片

這就是 3 種 typescript 聲明模塊的語法,以及聲明全局類型的方式。

那么如果就是需要引入模塊,但是也需要全局聲明類型,有什么更好的方式呢?

有,通過編譯器指令 reference。這樣既可以引入類型聲明,又不會導致所有類型聲明都變為模塊內的:

圖片

可以看到很多 dts 都這樣引入別的 dts 的,就是為了保證引入的類型聲明依然是全局的:

圖片

總結

TypeScript 給 JavaScript 添加了類型信息,在編譯時做類型檢查。

除了在變量聲明時定義類型外,TS 也支持通過 declare 單獨聲明類型。只存放類型聲明的文件后綴是 d.ts。

TypeScript 有三種存放類型聲明的地方:

  • lib:內置的類型聲明,包含 dom 和 es 的,因為這倆都是有標準的。
  • @types/xx:其他環境的 api 類型聲明,比如 node,還有 npm 包的類型聲明。
  • 開發者寫的代碼:通過 include + exclude 還有 files 指定。

其中,npm 包也可以同時存放 ts 類型,通過 packages.json 的 types 字段指定路徑即可。

常見的是 vue 的類型是存放在 npm 包下的,而 react 的類型是在 @types/react 里的。因為源碼一個是 ts 寫的,一個不是。

巧合的是,TS 聲明模塊的方式也是三種:

  • namespace:最早的實現模塊的方式,編譯為聲明對象和設置對象的屬性的 JS 代碼,很容易理解。
  • module:和 namespace 的 AST 沒有任何區別,只不過一般用來聲明 CommonJS 的模塊,在 @types/node 下有很多。
  • es module:es 標準的模塊語法,ts 額外擴展了 import type。

dts 的類型聲明默認是全局的,除非有 es module 的 import、export 的聲明,這時候就要手動 declare global 了。為了避免這種情況,可以用 reference 的編譯器指令。

深入掌握 TypeScript 的話,除了學習類型定義以及類型編程,這三種類型聲明的來源(lib、@types、用戶目錄),以及三種模塊聲明的方式(namespace、module、es module),還有全局類型的聲明(global、reference),也都是要掌握的。

責任編輯:武曉燕 來源: 神光的編程秘籍
相關推薦

2011-01-18 15:35:59

jQueryJavaScriptweb

2010-05-11 14:08:50

MySQL數字類型

2009-06-29 18:21:29

Hibernate

2018-12-13 20:14:18

物聯網平臺物聯網IOT

2009-11-24 18:15:37

博科資訊管理軟件

2009-11-13 09:39:48

2009-08-03 17:41:20

ASP.NET Cac

2010-04-02 13:15:01

Oracle跟蹤

2010-11-01 11:57:18

DB2客戶端

2013-09-02 15:35:00

2010-04-12 16:35:15

Oracle數據庫

2010-09-24 19:18:22

SQL索引

2023-10-13 00:00:00

Redis模塊空間對象

2010-09-09 10:43:56

VPN服務

2020-05-08 07:26:16

物聯網平臺物聯網IOT

2010-06-08 09:39:40

UML圖

2010-10-28 10:27:35

oracle賦權

2010-09-25 14:38:29

SQL分頁

2009-07-16 16:23:59

Swing線程

2009-08-06 15:26:18

C#異常類型
點贊
收藏

51CTO技術棧公眾號

精品调教chinesegay| 亚洲精品免费在线| 国产欧美日韩丝袜精品一区| 午夜成人亚洲理伦片在线观看| 日韩福利影视| 亚洲亚洲精品在线观看| 欧美精品一区二区三区在线四季 | 日本一区高清| 奇米888四色在线精品| 欧美日本高清一区| 熟女高潮一区二区三区| 高清不卡一区| 日韩欧美国产一区二区| 黄频视频在线观看| 日韩欧美在线观看一区二区| 狠狠网亚洲精品| 51久久精品夜色国产麻豆| 无码人中文字幕| 日韩美女精品| 精品伦理精品一区| 三级a三级三级三级a十八发禁止| 好久没做在线观看| 国产精品久99| 欧美一区二区三区四区夜夜大片| 精品区在线观看| 免费看黄色91| 奇门遁甲1982国语版免费观看高清 | 免费观看中文字幕| 精品亚洲综合| 99久久久国产精品免费蜜臀| 亚洲xxxxx性| 中文字幕+乱码+中文| 亚洲美女少妇无套啪啪呻吟| 日韩视频精品在线| 色噜噜噜噜噜噜| 日韩有码av| 精品久久人人做人人爱| 涩涩网站在线看| 成人一区视频| 欧洲一区二区三区免费视频| 日本三级免费网站| cao在线视频| 亚洲高清一区二区三区| 成人污网站在线观看| 秋霞a级毛片在线看| 欧美国产日韩a欧美在线观看| 久久久一本精品99久久精品66| 亚洲AV无码一区二区三区少妇| 久久www免费人成看片高清| 国产精品久久久久久久久久东京| 国产又大又黄又粗| 久久精品伊人| 国产精品电影网| 国产免费a视频| 日日摸夜夜添夜夜添国产精品| 欧洲永久精品大片ww免费漫画| 在线能看的av| 巨乳诱惑日韩免费av| 日韩av免费看| 中文字幕 亚洲视频| 久久精品二区亚洲w码| 国产精品视频播放| 国产欧美一级片| 国产精品一区二区三区网站| 97碰碰视频| 秋霞网一区二区| 久久综合一区二区| 视频一区二区三| 拍真实国产伦偷精品| 亚洲欧洲综合另类在线| 成人黄色片免费| 国产ktv在线视频| 欧美日韩午夜激情| 国产福利影院在线观看| 免费成人毛片| 欧美va日韩va| 亚洲天堂网一区二区| 禁果av一区二区三区| 国产精久久一区二区| 91免费在线看| 亚洲成人蜜桃| av网站网址在线观看| 亚洲风情在线资源站| 国产h视频在线播放| 色成人免费网站| 91精品国产综合久久小美女| av av在线| 国产一区二区三区四区大秀| 精品久久久av| 日本一级黄色录像| 奇米亚洲午夜久久精品| 成人片在线免费看| 国产乱视频在线观看| 亚洲日本va午夜在线影院| 日本中文字幕网址| 成人国产在线| 欧美精品一区二| 国产免费无遮挡吸奶头视频| 2023国产精品久久久精品双| 97人人做人人爱| 国产精品久久久国产盗摄| 成人福利视频在线看| 日日夜夜精品网站| 成人性生交大片免费看网站| 欧美日免费三级在线| 日韩少妇一区二区| 亚洲91久久| 欧洲美女免费图片一区| 亚洲成人一二三区| 国产精品免费视频观看| 人人干视频在线| 91麻豆精品| 亚洲图中文字幕| 日本三级中文字幕| 国产一区二区在线免费观看| 欧美激情专区| 9lporm自拍视频区在线| 欧美高清性hdvideosex| 欧美一区二区三区四区五区 | 国内激情视频在线观看| 欧美日韩国产乱码电影| 国产国语性生话播放| 欧美一区久久| 国产美女91呻吟求| 福利片在线看| 欧美性生活大片免费观看网址| 欧美一级大片免费看| 日韩综合网站| 国产成人综合精品在线| 三级视频网站在线| 午夜不卡av免费| 岛国大片在线免费观看| 91高清一区| 国产美女久久精品香蕉69| 国产福利片在线| 色偷偷一区二区三区| 亚洲精品女人久久久| 亚洲黄色成人| 精品福利影视| av日韩国产| 精品av久久707| 久久免费公开视频| 懂色av一区二区三区免费看| 色婷婷777777仙踪林| 亚洲tv在线| 久久久精品一区| 国产精品久久免费| 亚洲少妇30p| 欧美一级特黄aaa| 亚洲va在线| 亚洲va久久久噜噜噜久久天堂| 美女隐私在线观看| 欧美一级专区免费大片| www青青草原| 最新中文字幕第一页| 国产亚洲成人一区| 久久久国产精品一区二区三区| 蜜臀久久精品| 亚洲视频在线观看视频| av首页在线观看| 国产精品久久免费看| 天天色天天综合网| 欧美成人精品| 久久一区二区三区av| 美女100%一区| 精品国产一区二区三区四区在线观看| 国产精品久久欧美久久一区| 亚洲美女免费在线| 久久精品综合视频| 日韩av中文字幕一区二区| 亚洲欧美日韩综合一区| 久久久91麻豆精品国产一区| 欧美极度另类性三渗透| 青青青免费视频在线2| 欧洲中文字幕精品| 69av视频在线| 国产精品一区二区视频| 99精品在线免费视频| 精品视频免费| 91精品综合久久| 欧美在线极品| 久久色精品视频| 五月天激情开心网| 欧美精品三级在线观看| 国产一级在线观看视频| 久久九九影视网| 91pony九色| 国产精品久久久久毛片大屁完整版| 视频二区一区| 国产精品久久久久久久久久白浆| 国产成人鲁鲁免费视频a| 草莓福利社区在线| 亚洲欧美日韩精品| 性欧美videos另类hd| 色国产精品一区在线观看| 国产尤物在线播放| 久久久精品综合| 韩国三级在线播放| 强制捆绑调教一区二区| 国产成a人亚洲精v品在线观看| 蜜臀91精品国产高清在线观看| 91美女片黄在线观| 国产视频1区2区3区| 久久影院一区二区三区| 国产91成人在在线播放| caopo在线| 国产一区二区三区在线观看视频| 亚洲国产综合网| 欧美人牲a欧美精品| 国产精品男女视频| 亚洲一区二区3| www深夜成人a√在线| 久久久91精品国产一区二区精品 | av成人动漫在线观看| 女人高潮一级片| 三级影片在线观看欧美日韩一区二区| 大地资源网在线观看免费官网| 日韩a一区二区| 欧美日韩亚洲综合一区二区三区激情在线 | 亚洲午夜精品在线| 日韩av手机在线免费观看| 久久先锋影音av| 亚洲一区二区三区黄色| 国产一区二区电影| 可以看污的网站| 免费人成黄页网站在线一区二区| 日韩av三级在线| 伊人精品视频| 久久av综合网| 欧美亚洲不卡| 日韩精品综合在线| 欧美视频在线观看| 久久久久久av无码免费网站下载| 91蜜臀精品国产自偷在线| 日产中文字幕在线精品一区| 日韩丝袜视频| 欧美久久久久久| 国产99亚洲| 蜜桃免费一区二区三区| 精品三级av在线导航| 成人片在线免费看| 国产极品模特精品一二| 国产aⅴ精品一区二区三区黄| 免费欧美网站| 国产精品v欧美精品v日韩精品| 视频欧美一区| 国产精品久久亚洲7777| 林ゆな中文字幕一区二区| 国产三区精品| 天堂在线精品| 日韩免费毛片| 91综合网人人| 国产又粗又长又爽视频| 亚洲视频观看| 91免费视频网站在线观看| 美女日韩在线中文字幕| 中文字幕国产传媒| 精品一区二区三区在线观看国产| 亚洲午夜激情影院| 成人一级黄色片| 亚洲一区二区三区蜜桃| 日本一区二区三区在线不卡| 国产传媒在线看| 亚洲三级在线免费| 国产第一页在线播放| 欧美性极品少妇精品网站| 免费av中文字幕| 欧美一区二区私人影院日本| 精品久久国产视频| 亚洲精品国产美女| 成人三级黄色免费网站| 久久视频国产精品免费视频在线| 久久国产精品黑丝| 欧美一区二区三区…… | 欧美日韩国产经典色站一区二区三区| 亚洲一区二区三区高清视频| 欧美一区二区三区人| 免费观看黄色一级视频| 国产亚洲一区二区精品| 成人免费网站在线观看视频| 91av在线播放视频| 久久久久久久性潮| 国产精品v欧美精品v日韩| 奇米亚洲欧美| 日韩精品一区二区在线视频| 久久综合九色| 粗大的内捧猛烈进出视频| 久久久久久久久久久久久久久99| 国产jizz18女人高潮| 亚洲电影第三页| 最近中文字幕在线免费观看| 精品毛片乱码1区2区3区| 国产福利第一视频在线播放| 欧美精品一本久久男人的天堂| 精品91久久| av日韩免费电影| 日韩一区二区在线| 国产成人在线免费看| 国产福利一区二区三区视频在线| 色哟哟精品观看| 亚洲午夜久久久久久久久电影网| 亚洲天堂自拍偷拍| 精品丝袜一区二区三区| 免费在线看电影| 成人网在线观看| 国产成人调教视频在线观看 | 免费毛片b在线观看| 91视频免费在线| 欧美色图一区| 亚洲 高清 成人 动漫| 国产精品自拍在线| 色噜噜噜噜噜噜| 色综合久久天天| 天堂在线视频免费| 久久91亚洲精品中文字幕奶水| 91国拍精品国产粉嫩亚洲一区| 久久99国产精品| 欧美三级视频| 国产高清999| 国产精品乱码一区二区三区软件 | 大香伊人中文字幕精品| 91精品视频网站| 日韩片欧美片| 国产三级三级三级看三级| 91麻豆免费看片| 免费看日韩毛片| 亚洲成人av在线| 电影k8一区二区三区久久| 亚洲999一在线观看www| 99精品在线观看| 国产成人美女视频| 国产精品麻豆久久久| 中日韩在线观看视频| 亚洲一区www| 黄色成人在线观看网站| 日韩久久在线| 免费成人在线观看| 性爱在线免费视频| 欧美性高清videossexo| 国产九色在线| 国产精品久久久久久久久久久久久久| 亚洲系列另类av| 日本va中文字幕| 国产日韩影视精品| 自拍偷拍精品视频| 色婷婷综合成人av| 日韩第二十一页| 成人在线免费观看网址| 国产精品一卡二| 国产一级特黄毛片| 日韩精品免费在线视频| 中文字幕高清在线播放| 欧美精品与人动性物交免费看| 天堂久久一区二区三区| 永久免费av无码网站性色av| 欧美日韩一级视频| 黄av在线免费观看| 岛国视频一区| 国产精品资源| 日本黄色小视频在线观看| 欧美精品一级二级三级| 欧美xxx黑人xxx水蜜桃| 国产乱码精品一区二区三区日韩精品| 亚洲日韩视频| 久久美女免费视频| 欧美精品粉嫩高潮一区二区| 在线电影福利片| 久久综合九色综合网站| 久久亚洲一区| 99鲁鲁精品一区二区三区| 精品国产露脸精彩对白| 欧美动物xxx| eeuss中文| 成人av资源站| 制服丝袜在线一区| 九九热r在线视频精品| 欧美一性一交| 永久免费的av网站| 午夜影院久久久| 国产原创av在线| 91精品天堂| 日韩在线a电影| 久久久久亚洲av成人片| 亚洲人成电影网| 亚洲精品黑牛一区二区三区| 欧美xxxxx在线视频| 亚洲激情网站免费观看| 日本啊v在线| 147欧美人体大胆444| 石原莉奈在线亚洲二区| 免费中文字幕在线观看| 国产亚洲一级高清| 大陆精大陆国产国语精品 | 国产一区在线视频| 特黄视频免费看| 欧美大片免费看| 日韩中文字幕高清在线观看| 亚洲天堂资源在线| 欧美一区二区日韩| 91看片一区|