精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

澳门成人av| 9191在线播放| 久久99国产乱子伦精品免费| 欧美成人精品h版在线观看| 亚洲一区二区三区黄色| 欧美理论影院| 亚洲免费观看高清完整版在线观看 | 欧美日韩国产一二三区| 电影一区二区在线观看| 在线国产电影不卡| www.激情网| 91九色在线porn| 不卡的电视剧免费网站有什么| 日韩免费在线免费观看| 免费一级片视频| 欧美精品一二| 亚洲国产精品女人久久久| 最近中文字幕一区二区| а√在线天堂官网| 最新成人av在线| 欧美日韩喷水| 国产 欧美 自拍| 蜜桃av一区二区三区电影| 97色在线观看| 69av视频在线| 久久视频精品| 亚洲最新中文字幕| 一级少妇精品久久久久久久| 亚洲精品无播放器在线播放| 日本乱码高清不卡字幕| 激情伊人五月天| 亚洲综合图区| 综合久久久久久| 午夜久久资源| 精品亚洲综合| 91玉足脚交白嫩脚丫在线播放| 亚洲在线视频观看| 一级视频在线播放| 日本不卡在线视频| 国产不卡av在线| 亚洲婷婷综合网| 一区二区91| 国模视频一区二区三区| 欧美日韩中文字幕在线观看 | 久久奇米777| 精选一区二区三区四区五区| 成人毛片视频免费看| 国产很黄免费观看久久| 亚洲伊人久久综合| 999久久久久| 国产在线播放一区| 91网在线免费观看| 国产美女裸体无遮挡免费视频| 日本不卡一二三区黄网| 国产精品激情av在线播放| 久草视频一区二区| 日韩精品欧美精品| 国产精品旅馆在线| 亚洲天堂男人网| 久草这里只有精品视频| 91九色视频导航| 国产黄色片av| 成人国产电影网| 久草一区二区| 国产裸舞福利在线视频合集| 中文字幕国产一区| 中文字幕一区二区三区有限公司| 欧美精品hd| 怡红院av一区二区三区| av在线观看地址| 日本不卡网站| 欧美日韩一区 二区 三区 久久精品| 天天干天天干天天干天天干天天干| 成人毛片免费| 日韩一区二区精品葵司在线| 亚洲一区和二区| 亚洲深夜福利在线观看| 亚洲午夜久久久久久久| 久久嫩草捆绑紧缚| 欧美区亚洲区| 欧美自拍视频在线观看| 中日精品一色哟哟| 国产在线麻豆精品观看| 国产精品日韩一区二区免费视频| 丰满大乳国产精品| 国产日韩欧美一区二区三区综合| 在线观看国产一区| а√在线中文在线新版| 欧美熟乱第一页| ass极品水嫩小美女ass| 亚洲理论电影片| 久久久91精品国产| 日韩精品在线免费视频| 久久99精品国产麻豆婷婷洗澡| 92福利视频午夜1000合集在线观看| 欧美一级视频免费| 国产精品免费网站在线观看| 日韩精品一区二区在线视频| 成人勉费视频| 欧美不卡一区二区| 999福利视频| 一级成人国产| 99精品在线直播| 激情小视频在线| 亚洲午夜成aⅴ人片| 天天干天天综合| 精品视频自拍| 免费91在线视频| 色老头一区二区| 不卡欧美aaaaa| 波多野结衣三级在线| 涩涩av在线| 精品裸体舞一区二区三区| 亚洲一区二区三区免费观看| 三区视频在线观看| 日韩av资源网| 日韩中文在线观看| 国产农村妇女aaaaa视频| 国产一区二区精品在线观看| 免费试看一区| 成入视频在线观看| 91麻豆精品国产91久久久久久久久 | 91免费看片在线观看| 强开小嫩苞一区二区三区网站 | 乱码第一页成人| 不卡视频一区二区三区| 日本在线人成| 欧美性猛交xxxx乱大交退制版| 在线视频 日韩| 国户精品久久久久久久久久久不卡| 国产乱肥老妇国产一区二| 你懂的视频在线| 欧美日韩久久久久| 中文字幕一区二区三区乱码不卡| 中文精品电影| 亚洲自拍偷拍一区| 超碰在线网址| 欧美一区午夜视频在线观看 | 亚洲一区视频在线观看视频| 99re6在线观看| 欧美激情理论| 国产在线观看91精品一区| 中文字幕日本在线| 欧美视频一区在线| av资源在线免费观看| 美国三级日本三级久久99| 日韩欧美亚洲在线| 开心久久婷婷综合中文字幕| 中文字幕欧美在线| 进去里视频在线观看| 欧美精彩视频一区二区三区| 国产精品涩涩涩视频网站| 国产一区国产二区国产三区| 国产91色在线免费| www.亚洲资源| 欧美精品1区2区3区| 青花影视在线观看免费高清| 国产麻豆成人精品| 高清无码视频直接看| 亚洲一区 二区| 91精品国产91久久久久久吃药| 特黄视频在线观看| 91福利精品第一导航| www成人啪啪18软件| 精品中文字幕一区二区小辣椒| 一区二区三区四区不卡| 日韩三级久久| 26uuu久久噜噜噜噜| 玖玖综合伊人| 欧美巨大另类极品videosbest| 欧美丰满熟妇bbbbbb| 成人精品一区二区三区四区 | 亚洲欧美小视频| 高清在线成人网| 欧美日韩在线中文| 欧美激情成人| 国产在线一区二| 国产成人精品一区二三区在线观看 | 亚洲欧美成人| 亚洲精品欧美精品| 天堂精品在线视频| 日韩av手机在线看| 成人影院在线看| 日韩精品一二三四区| 中文字幕视频免费观看| 一区二区三区中文字幕精品精品| 亚洲调教欧美在线| 久久99久久99精品免视看婷婷| www国产免费| 久久不见久久见国语| 亚洲一区二区三区毛片| 亚洲一级少妇| 久久成人免费视频| 蜜桃视频在线免费| 欧美一区2区视频在线观看| 欧美a∨亚洲欧美亚洲| 中文字幕一区在线观看视频| 国产老熟女伦老熟妇露脸| 免费日本视频一区| 东北少妇不带套对白| 成人免费在线播放| 好吊色欧美一区二区三区视频| 成人国产综合| 欧美中文字幕第一页| 中文在线观看免费| 中文字幕亚洲综合久久| 无码精品视频一区二区三区| 91精品欧美一区二区三区综合在| 特级毛片www| 一区av在线播放| 日本裸体美女视频| 久久美女艺术照精彩视频福利播放| 波多野吉衣在线视频| 久久精品国产99| 日韩亚洲在线视频| 国产偷自视频区视频一区二区| 日日噜噜噜夜夜爽爽| 精品国产一区二区三区香蕉沈先生 | 57pao国产一区二区| 国产专区精品视频| 国产成人精品一区二三区在线观看| 国外成人免费在线播放| 亚洲h片在线看| 久久精品免费播放| 在线播放麻豆| 中文欧美在线视频| 美女做暖暖视频免费在线观看全部网址91| 日韩欧美综合一区| 国产三级漂亮女教师| 欧美片网站yy| 日批视频免费观看| 欧美在线播放高清精品| 日韩在线视频不卡| 色婷婷久久久亚洲一区二区三区| 成人免费区一区二区三区| 亚洲国产精品久久一线不卡| 久草视频免费在线播放| 一区二区三区欧美日韩| 永久看片925tv| 亚洲乱码中文字幕综合| 日韩欧美综合视频| 亚洲精品免费在线| 免费毛片在线播放免费| 一区二区三区在线看| 真实国产乱子伦对白在线| 一区二区免费看| 国产精品99无码一区二区| 亚洲不卡在线观看| 日本韩国欧美中文字幕| 欧美日韩中文字幕在线视频| 久久精品视频1| 在线这里只有精品| 中文字幕一区二区三区免费看| 欧美日韩激情在线| 国产精品视频a| 欧美成人精品1314www| 狠狠躁日日躁夜夜躁av| 日韩精品免费电影| 国产主播福利在线| 日韩在线免费视频观看| 二区三区在线观看| 国内偷自视频区视频综合| 亚洲欧洲美洲av| 国产精品视频一| 久久精品免视看国产成人| 国产经典一区二区三区| 四虎影视精品| 亚洲一区精品视频| 欧美精品国产一区二区| 亚洲美免无码中文字幕在线| 久久亚洲图片| 日本精品一区在线| 成人a免费在线看| 偷拍夫妻性生活| 国产精品美女久久久久aⅴ国产馆| 中文字幕美女视频| 亚洲va在线va天堂| 伊人网视频在线| 精品国产一区a| 成人免费黄色网页| 欧美高清第一页| 日韩另类视频| 国产精品入口免费| 久久激情电影| 国产3p露脸普通话对白| 三级在线观看一区二区| 性生活在线视频| 久久精品欧美一区二区三区不卡| 日韩一卡二卡在线观看| 大桥未久av一区二区三区| 国产模特av私拍大尺度| 亚洲男人天堂久| 中文字幕有码在线观看| 国产精品久久久久久av下载红粉| 日韩精品亚洲专区在线观看| 欧美系列一区| 国内在线观看一区二区三区| 成人免费视频久久| 成人av免费在线观看| 五月婷婷六月香| 欧美性高跟鞋xxxxhd| 国产精品无码AV| 亚洲人线精品午夜| 韩国成人免费视频| 国产日韩中文在线| 蜜臀久久99精品久久一区二区 | av老司机在线观看| 国产在线精品播放| 国产一区二区三区四区五区传媒 | 免费观看久久久4p| 久久国产精品无码一级毛片| 一区二区三区在线影院| 91精品国自产| 中文字幕欧美国内| 欧美成人资源| 久久av一区二区三区漫画| 午夜精品久久| 少妇愉情理伦片bd| 亚洲视频一区在线| 在线黄色av网站| 亚洲夜晚福利在线观看| 一区二区乱码| 九九九久久久| 亚洲三级网站| 欧美夫妇交换xxx| 一区二区三区欧美亚洲| 国产毛片毛片毛片毛片毛片| 中文字幕一区二区精品| 中文字幕av一区二区三区佐山爱| 韩国成人一区| 亚洲免费成人| 人体私拍套图hdxxxx| 亚洲一区影音先锋| 欧美一级视频免费| 久久人91精品久久久久久不卡| 日韩成人精品| 中国黄色录像片| 国产精品一区在线| 青春草免费视频| 日韩免费成人网| 毛片在线导航| 国产高清精品一区| 影音先锋久久久| 中文字幕 日本| 欧美日韩美女视频| 美女毛片在线看| 国产成人一区二区三区小说| 国产不卡av一区二区| 能在线观看的av网站| 国产欧美日韩视频一区二区| 国产免费www| 色av中文字幕一区| 一区二区三区日本视频| 国产又粗又爽又黄的视频| 国产乱码精品一区二区三区五月婷| 日本精品在线免费观看| 日韩一二在线观看| а√天堂资源官网在线资源| 久久99精品久久久久久秒播放器| 免费一区视频| 1024手机在线观看你懂的| 欧美美女bb生活片| 三级网站视频在在线播放| 国产精品久久久对白| 国产欧美午夜| 蜜桃久久精品成人无码av| 欧美日韩精品一区二区三区蜜桃| 黄色在线免费网站| 国产精品一区二区三区四区五区| 亚洲一区日韩| 亚洲色图欧美色| 日韩一区二区免费电影| 蜜桃av在线播放| 亚洲国产精品视频一区| 国产黄人亚洲片| 成人免费毛片男人用品| 精品国产一区二区在线| 豆花视频一区二区| 乱子伦视频在线看| 亚洲欧美成人一区二区三区| 丁香花免费高清完整在线播放| 国产精品99久久久久久久久 | 三级a在线观看| 一区二区三区在线免费观看| 全色精品综合影院| 成人天堂噜噜噜| 99国产精品久久久久久久成人热| 精品人伦一区二区| 日韩欧美一级二级三级| japanese23hdxxxx日韩| 成人短视频在线观看免费| 久久久99精品免费观看不卡| 国产人妻精品一区二区三区| 5566成人精品视频免费| 91九色精品国产一区二区| 黄色片视频免费观看| 欧美精品乱码久久久久久按摩| 国产99在线观看| 潘金莲一级淫片aaaaa免费看| aaa亚洲精品一二三区|