1. 程式人生 > 其它 >資料庫軟考:計算機硬體系統的組成、CPU的組成、進位制轉換、儲存器與匯流排、輸入輸出控制

資料庫軟考:計算機硬體系統的組成、CPU的組成、進位制轉換、儲存器與匯流排、輸入輸出控制

參考:

  1. https://juejin.cn/post/6981728323051192357
  2. https://github.com/joye61/typescript-tutorial
  3. https://ts.xcatliu.com/basics/union-types.html
  4. https://segmentfault.com/a/1190000038959316

0 定義

Typed JavaScript at Any Scale
添加了型別系統的 JavaScript,適用於任何規模的專案。

特點:
型別系統、適用於任何規模。

2020-08:TypeScript 釋出了 4.0 版本。
2020-09:Vue 釋出了 3.0 版本,官方支援 TypeScript。

1 Typesript 優缺點、與JS對比

1.0 優點

  1. 程式碼的可讀性和可維護性(會提醒值的型別)
  2. 在編譯階段就發現大部分錯誤,避免了很多線上bug
  3. 增強了編輯器和 IDE 的功能,包括程式碼補全、介面提示、跳轉到定義、重構等
  4. TypeScript 還可以和 JavaScript 共存

1.1 缺點

  1. 有一定的學習成本,需要理解介面(Interfaces)、泛型(Generics)、類(Classes)、列舉型別(Enums)等
  2. 一些JavaScript庫需要相容,提供宣告檔案,像vue2,底層對ts的相容就不是很好。
  3. ts編譯是需要時間的,這就意味著專案大了以後,開發環境啟動和生產環境打包的速度就成了考驗

1.2 與JS對比

  1. 都是弱型別
  2. TypeScript 是靜態型別
TS JS
強弱型別 (是否允許隱式型別轉換) 弱型別 弱型別
靜態/動態型別 靜態 動態
  1. TypeScript支援所有原始資料型別,ES6不支援

  2. 變數作用域:
    TypeScript有3個作用域:全域性作用域、類作用域、區域性作用域。
    ES6有2個作用域:全域性作用域、區域性作用域。

  3. TypeScript是一種免費的開源程式語言,由Microsoft開發和維護。ES6是ECMAScript(ES)的一個版本,它是ECMA 國際標準化的指令碼語言規範。

  4. 箭頭函式:在typescript中=>不僅可以是箭頭函式,還可以是函式型別定義

type Operator = (x: number, y: number) => number;

2 Typescript 基礎使用

2.0 為引數提供型別描述

// InputType描述了一個包含show方法的型別
type InputType = {
  show: ()=>void;
};
showInput(input: InputType);
//說明input這個引數,在showInput函式裡會呼叫show這個方法。如果傳個字串進去的話,是會報錯的,因為沒有show這個方法。

2.1 值型別

在TypeScript中,所有的值都具有強制型別。值的型別化是TypeScript區別於JavaScript最顯著的特徵
(JavaScript的型別資訊是在編譯階段由編譯器判定)

型別 語法形式
數字型別 number
布林型別 boolean
字串型別 string
符號型別 symbol
Void型別 void
Null型別 null
Undefined型別 undefined
Never型別 never
任意型別 any
陣列型別 T[]
元組型別 [T0, T1, ...]
列舉型別 enum T { ... }
函式型別 (p1: T1, p2: T2, ...) => T
類型別 T
構造器型別 new (p1: T1, p2: T2, ...) => R
物件型別 { ... } 或 interface T { ... }
聯合型別 `T1
交叉型別 T1 & T2 & ...

2.2 聯合型別

聯合型別(Union Types)表示取值可以為多種型別中的一種。
用|分隔不同型別

2.3 介面 Interfaces

使用介面(Interfaces)來定義物件的型別。
在面嚮物件語言中,介面是對行為的抽象,具體如何行動需要由類(classes)去實現(implement)。

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

let tom: Person = {
    name: 'Tom',
    age: 25
};

//定義了一個介面 Person,接著定義了一個變數 tom,它的型別是 Person。

定義的變數比介面少了一些屬性是不允許的

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

let tom: Person = {
    name: 'Tom'
};

// index.ts(6,5): error TS2322: Type '{ name: string; }' is not assignable to type 'Person'.
//   Property 'age' is missing in type '{ name: string; }'.

2.3.0 可選屬性

如果不需要完全匹配一個形狀,那麼可以用可選屬性:
(但仍然不允許新增未定義的屬性)

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

let tom: Person = {
    name: 'Tom'
};

2.3.1 任意屬性

PS:一旦定義了任意屬性,那麼確定屬性和可選屬性的型別都必須是它的型別的子集:

interface Person {
    name: string;
    age?: number;
    [propName: string]: string;
}
// age戶型

2.3.2 只讀屬性:只允許建立時賦值

interface Person {
    readonly id: number;
    name: string;
    age?: number;
    [propName: string]: any;
}

2.4 陣列

幾種宣告陣列的方式

  1. 型別 + 方括號: number[]
  2. 陣列泛型:let fibonacci: Array = [1, 1, 2, 3, 5];
    (陣列泛型:https://ts.xcatliu.com/advanced/generics.html)
  3. 用介面表示陣列(不過一般不會這麼做)
  4. 類陣列:arguments,其實不是陣列型別
  5. 用 any 表示陣列中允許出現任意型別:
    let list: any[] = ['xcatliu', 25, { website: 'http://xcatliu.com' }];

2.5 函式

  1. 不允許輸入多餘/缺少的引數
  2. 用介面定義函式的形狀
  3. 可選引數:可選引數後面不允許再出現必需引數了

2.6 類型別名

感覺是有利於程式碼可讀性

type Name = string;
type NameResolver = () => string;
type NameOrResolver = Name | NameResolver;
function getName(n: NameOrResolver): Name {
    if (typeof n === 'string') {
        return n;
    } else {
        return n();
    }
}