從 JavaScript 語法改寫為 TypeScript 語法,有兩個關鍵點,一點是類別成員變數(Field)需要聲明,另一點是要為各種東西(變數、參數、函數/方法等)聲明類型。
從 ES6 語法改寫為 TypeScript 語法,有兩個比較重要的知識點,一個是宣告類別成員,另一個是宣告類型。這兩個語法特點在 JavaScript 中都不存在。而這兩個點直接引出了兩個關鍵性的問題,有哪些類型?怎樣聲明?
類型
在說TypeScript 的型別之前,我們先複習一下JavaScript 的七種型別:
undefined
function
boolean
number
string
object
symbol
這七種型別都是可以透過typeof 運算子算出來的,但其中並沒有我們常見的Array、null,Date 之類的類型——因為它們其實都是object。
TypeScript 的重要特性之一就是型,所以TypeScript 中的型別要講究得多,除了JavaScript 中的型別之外,還定義了其它一些(不完全列表)
Array
null,空型,其作用與strictNullChecks 編譯參數有關
Tuple(元組),形如[Number, String]
enum T,定義枚舉類型T,可理解為集中對數值常數進行命名
interface T,接口,T 是一種接口類型
class T,類, T 是一種類型
any,代表任意型別
void,表示沒有類型,用於宣告函數型別
never,表示函數不可傳回的神奇型別
……
具體的類型這裡就不詳述了,官方Handbook 的 Basic Type、Interfaces、Classes、Enum、Advanced Types 這幾部分說得非常清楚。
不過仍有一種與類型相關的特性不得不提-泛型。如果只是說資料型,純粹的 JSer 們還可以理解,畢竟類型不是新鮮玩意兒,只是擴展了點種類。但是泛型這個東西,純粹的 JSer 們可能就沒啥概念了。
泛型主要是用一個符號來表示一些類型,只要是符合約束條件(預設無約束)的類型,都可以替換掉這個類型符號來使用,例如
function test
console.log(v);}
test
#泛型與強型別相關,即需要嚴格的型別檢查,又想少寫相似程式碼,所以乾脆用某個符號來代替類型。泛型這個名稱本身可能不是很好理解,但是如果借用 C++ 的「模板」概念,就好理解了。例如上面的泛型函數,根據後面的調用,可以解釋為三個函數,相當於套用模板,用實際型別取代了T:
function test(v: boolean) { ... }function test( v: string) { ... }function test(v: number) { ... }
關於泛型,更詳細的內容可以參考Handbook 的Generic 部分。
類型就簡述到這裡,簡單的類型一看就能明白,高級一點的類型我們以後再開專題來詳述。不過既然選擇使用 TypeScript,必然會用到它的靜態型別特性,那就必須強化辨識類型的意識,養成這樣的習慣。對於純 JSer 來說,這是一個巨大的挑戰。
宣告類型
宣告類型,主要指宣告變數/常數,函數/方法與類別成員的型別。 JS 中使用 var 宣告一個變量,ES6 擴展了 let 和 const。這幾種聲明 TypeScript 都支援。要為變數或常數指定型別也很簡單,就是在變數/常數名後面加個冒號,再指定型別即可,例如
// # typescript // 声明函数 pow 是 number 类型,即返回值是 number 类型// 声明参数 n 是 number 类型function pow(n: number): number { return n * n;} // 声明 test 是无返回值的function test(): void { for (let i: number = 0; i < 10; i++) { // 声明 i 是 number console.log(pow(i)); }}
這段程式碼示範了對函數型別、參數型和變數類型地聲明。這相對於 JavaScript 程式碼來說,似乎變得更複雜了。但考慮下,如果我們在某處不小心這樣調用了pow:
// # javascript let n = "a";let r = pow(n); // 这里存在一个潜在的错误
JavaScript 不會提前檢查錯誤的,只有在執行到r = pow(n) 的時候給r 賦值為NaN。然後如果別處又用到 r,可能就會造成連鎖錯誤,可能很要調試一陣才把問題找得出來。
不過上面兩行程式碼在TypeScript 裡是通不過轉譯的,它會報告一個類型不符的錯誤:
Argument of type 'string' is not assignable to parameter of type 'number'.
宣告類別成員
這時先來看一段JavaScript 程式碼
// # javascript (es6) class Person { constructor(name) { this._name = name; } get name() { return this._name; }}
這段JavaScript 程式碼如果翻譯成TypeScript 程式碼,會是這樣
// # typescript class Person { private _name: string; public constructor(name: string) { this._name = name; } public get name(): string { return this._name; }}
注意到 private _name: string,这句话是在声明类成员变量 _name。JavaScript 里是不需要声明的,对 this._name 赋值,它自然就有了,但在 TypeScript 里如果不声明,就会报告属性不存在的错误:
Property '_name' does not exist on type 'Person'.
虽然写起来麻烦了一点,但是我也能理解 TypeScript 的苦衷。如果没有这些声明,tsc 就搞不清楚你在使用 obj.xxxx 或者this.xxxx 的时候,这个 xxxx 到底确实是你想要添加的属性名称呢,还是你不小心写错了的呢?
另外要注意到的是 private 和 public 修饰符。JavaScript 中存在私有成员,为了实现私有,大家都想了不少办法,比如闭包。
TypeScript 提供了 private 来修饰私有成员,protected 修改保护(子类可用)成员,public 修饰公共成员。如果不添加修饰符,默认作为 public,以兼容 JavaScript 的类成员定义。不过特别需要注意的是,这些修饰符只在 TypeScript 环境(比如转译过程)有效,转译成 JavaScript 之后,仍然所有成员都是公共访问权限的。比如上例中的 TypeScript 代码转译出来基本上就是之前的 JavaScript 代码,其 _name 属性在外部仍可访问。
当然在 TypeScript 代码中,如果外部访问了 _name,tsc 是会报告错误的
Property '_name' is private and only accessible within class 'Person'.
所以应用内使用 private 完全没问题,但是如果你写的东西需要做为第三方库发布,那就要想一些手段来进行“私有化”了,其手段和 JavaScript 并没什么不同。
小结
从 JavaScript 语法改写 TypeScript 语法,我们来做个简单的总结:
类成员需要声明。
变量、函数参数和返回值需要申明类型。
如果所有这些东西都要声明类型,工作量还是满大的,所以我建议:就接口部分声明类型。也就是说,类成员、函数/方法的参数和返回类型要声明类型,便于编辑器进行语法提示,局部使用的变量或者箭头函数,在能明确推导出其类型的时候,可以不声明类型。
以上是介紹JavaScript和TypeScript的聲明類型的詳細內容。更多資訊請關注PHP中文網其他相關文章!

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。1.Python以简洁语法和丰富库生态著称,适用于数据分析和Web开发。2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

WebStorm Mac版
好用的JavaScript開發工具

禪工作室 13.0.1
強大的PHP整合開發環境

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

Atom編輯器mac版下載
最受歡迎的的開源編輯器

Dreamweaver CS6
視覺化網頁開發工具