TS 從入門到深度掌握,晉級TypeScript高手
TypeScript 是一種由微軟開發(fā)的開源編程語言,它是 JavaScript 的超集,為 JavaScript 添加了靜態(tài)類型和面向?qū)ο缶幊痰忍匦浴ypeScript 的目標(biāo)是提高 JavaScript 的可維護(hù)性和可擴(kuò)展性。在本篇文章中,我們將從 TypeScript 的入門一直到深入掌握,帶你進(jìn)入 TypeScript 的神奇世界。
## 1. 安裝 TypeScript
首先我們需要安裝 TypeScript??梢酝ㄟ^ npm 全局安裝 TypeScript:
```shell
npm install -g typescript
```
安裝完 TypeScript 后,我們就可以在命令行中使用 `tsc` 命令來將 TypeScript 轉(zhuǎn)換成 JavaScript 代碼。
## 2. 第一個 TypeScript 程序
創(chuàng)建一個 hello.ts 文件,然后在文件中輸入以下代碼:
```typescript
console.log("Hello, TypeScript!");
```
保存文件后,打開命令行并進(jìn)入該文件所在的目錄。運(yùn)行以下命令:
```shell
tsc hello.ts
```
命令執(zhí)行成功后,會在當(dāng)前目錄下生成一個 hello.js 文件。打開文件,可以看到它包含以下 JavaScript 代碼:
```javascript
console.log("Hello, TypeScript!");
```
可以在命令行中直接運(yùn)行這個 JavaScript 文件:
```shell
node hello.js
```
這樣就會在控制臺中輸出 `Hello, TypeScript!` 了。
## 3. 類型
TypeScript 是一種類型化的語言。與 JavaScript 不同,在 TypeScript 中,您可以為變量、函數(shù)參數(shù)和返回值指定類型,這可以大大減少代碼中的錯誤。
可以使用如下語法為變量指定類型:
```typescript
let variableName: type = value;
```
下面是一個示例:
```typescript
let num: number = 10;
let str: string = "Hello, TypeScript!";
let bool: boolean = true;
```
TypeScript 支持 JavaScript 的所有數(shù)據(jù)類型外,還提供了一些其他的數(shù)據(jù)類型,如枚舉、元組、void、never 等。
```typescript
enum Color {
? Red,
? Green,
? Blue
}
let color1: Color = Color.Red;
let color2: Color = Color.Green;
let color3: Color = Color.Blue;
let tuple: [string, number] = ["TypeScript", 2021];
function logMessage(): void {
? console.log("This is a log message");
}
function neverReturns(): never {
? throw new Error("An error occurred.");
}
```
## 4. 接口
TypeScript 中的接口可以用來定義數(shù)據(jù)類型的契約,以便更輕松地檢測代碼中的錯誤。
```typescript
interface Person {
? firstName: string;
? lastName: string;
? age: number;
}
let person: Person = {
? firstName: "John",
? lastName: "Doe",
? age: 30
};
```
## 5. 類
TypeScript 中也支持面向?qū)ο缶幊蹋梢允褂妙悂韯?chuàng)建對象。類可以包含屬性和方法。
```typescript
class Person {
? firstName: string;
? lastName: string;
? age: number;
? constructor(firstName: string, lastName: string, age: number) {
? ? this.firstName = firstName;
? ? this.lastName = lastName;
? ? this.age = age;
? }
? getFullName() {
? ? return this.firstName + " " + this.lastName;
? }
}
let person: Person = new Person("John", "Doe", 30);
console.log(person.getFullName());
```
## 6. 函數(shù)
TypeScript 中的函數(shù)可以指定函數(shù)參數(shù)和返回值的類型。
```typescript
function add(num1: number, num2: number): number {
? return num1 + num2;
}
let result = add(10, 20);
console.log(result);
```
可以看到,這個函數(shù)接受兩個數(shù)字作為參數(shù),并返回它們的和。
## 7. 泛型
TypeScript 中的泛型可以編寫靈活的代碼,因?yàn)樗试S您在編譯時指定特定類型的代碼。
```typescript
function identity<T>(arg: T): T {
? return arg;
}
let output1 = identity<number>(10);
let output2 = identity<string>("Hello, TypeScript");
console.log(output1); // 輸出 10
console.log(output2); // 輸出 "Hello, TypeScript"
```
## 8. 命名空間
命名空間是一種將代碼分成邏輯塊的方式。TypeScript 中的命名空間可以更好地組織和管理代碼。
```typescript
namespace Shapes {
? export function square(x: number) {
? ? return x * x;
? }
? export function circle(radius: number) {
? ? return Math.PI * radius * radius;
? }
}
console.log(Shapes.square(10)); // 輸出 100
console.log(Shapes.circle(10)); // 輸出 314.1592653589793
```
## 9. 模塊
與命名空間相似,模塊也是一種組織和管理代碼的方式。模塊可以將邏輯相關(guān)代碼封裝到一個單獨(dú)文件或一組文件中,使代碼更易于維護(hù)。TypeScript 中的模塊可以使用 `export` 和 `import` 關(guān)鍵字來實(shí)現(xiàn)。
```typescript
// logger.ts
export function logMessage(message: string) {
? console.log(message);
}
// app.ts
import { logMessage } from "./logger";
logMessage("Hello, TypeScript!");
```
## 10. 類型兼容性
TypeScript 中的類型兼容性是指一種類型是否可以賦值給另一種類型的概念。
```typescript
let num: number = 10;
let str: string = "Hello, TypeScript!";
num = str; // 報錯,類型 "string" 不能賦值給類型 "number"
```
以上示例中,將字符串類型賦值給數(shù)字類型將導(dǎo)致編譯錯誤。因?yàn)樗鼈兪遣煌念愋?,不能互相賦值。在 TypeScript 中,類型兼容性用于捕獲這些類型錯誤。
## 11. 類型斷言
有時候,TypeScript 無法確定變量的類型,這時候就需要開發(fā)者告訴 TypeScript 變量的確切類型。這可以通過類型斷言來實(shí)現(xiàn)。
```typescript
let someValue: any = "this is a string";
let strLength1: number = (<string>someValue).length;
let strLength2: number = (someValue as string).length;
```
在這個示例中,`someValue` 的類型為 `any`,它可以是任何類型。通過類型斷言,我們告訴 TypeScript `someValue` 是一個字符串,并獲取它的長度。
## 12. 繼承
TypeScript 支持面向?qū)ο缶幊讨械睦^承概念。
```typescript
class Animal {
? name: string;
? constructor(name: string) {
? ? this.name = name;
? }
? speak() {
? ? console.log(this.name + " makes a noise.");
? }
}
class Dog extends Animal {
? constructor(name: string) {
? ? super(name);
? }
? speak() {
? ? console.log(this.name + " barks.");
? }
}
let dog = new Dog("Rover");
dog.speak(); // 輸出 "Rover barks."
```
在這個示例中,我們定義了一個 Animal 類,它包含一個名稱屬性 `name` 和一個方法 `speak`。然后我們定義了一個 `Dog` 類,它繼承自 `Animal`,并重寫了 `speak` 方法。最后,我們創(chuàng)建了一個 `Dog` 對象并調(diào)用它的 `speak` 方法。
## 13. 接口繼承
在 TypeScript 中,接口也支持繼承。這意味著一個接口可以從其他接口繼承屬性和方法。
```typescript
interface Shape {
? color: string;
}
interface Square extends Shape {
? sideLength: number;
}
let square = {} as Square;
square.color = "blue";
square.sideLength = 10;
console.log(square.color);
console.log(square.sideLength);
```
在示例中,我們定義了一個接口 `Shape`,它有一個屬性 `color`。然后,我們定義了另一個接口 `Square`,它繼承了 `Shape`,并添加了一個 `sideLength` 屬性。最后,我們創(chuàng)建了一個 `Square` 對象,并為它的屬性賦值。
## 14. 命名空間與模塊
命名空間和模塊都可以用來組織代碼,但它們的工作方式有所不同。命名空間主要用于在全局范圍內(nèi)組織和管理代碼。模塊用于在模塊范圍內(nèi)組織和管理代碼,這意味著模塊中的變量、函數(shù)等在模塊外部是不可訪問的。
例如,假設(shè)我們有一個 `Calculator.ts` 文件包含一個簡單的計算器函數(shù),如下所示:
```typescript
// Calculator.ts
export function add(num1: number, num2: number): number {
? return num1 + num2;
}
```
這樣我們就可以將這個文件作為一個模塊導(dǎo)出。在我們的 `app.ts` 文件中,我們就可以使用以下代碼來訪問這個模塊中的函數(shù):
```typescript
// app.ts
import { add } from "./Calculator";
let result = add(10, 20);
console.log(result); // 輸出 30
```
## 15. 總結(jié)
在本篇文章中,我們從 TypeScript 的入門到深度掌握了許多重要的概念,如類型、函數(shù)、泛型、類和繼承、命名空間和模塊等。希望這篇文章對你有所幫助,能夠幫助你深入了解 TypeScript,成為一名 TypeScript 高手。