Typescript 進階類型

進階類型也是我自定義的,主要區別於上篇文章Typescript 基礎類型javascript

任意值

用來表示容許賦值爲任意類型。java

場景:在編程階段還不清楚類型的變量指定一個類型。好比來自用戶輸入或第三方代碼庫,咱們不但願類型檢查器對這些值進行檢查而是直接讓它們經過編譯階段的檢查。那麼任意值就派上用場了。git

// any.ts
let notSure: any = 1;
notSure = "換成字符串了";
notSure = false;
複製代碼

編譯後github

// any.js
var notSure = 1;
notSure = "換成字符串了";
notSure = false;
複製代碼

任意值還有屬性和方法,一塊兒看下typescript

先看屬性

// anyAttr.ts
let anyAttr: any = 'typescript';
console.log(anyAttr.name);
console.log(anyAttr.name.firstName);
複製代碼

編譯後編程

// anyAttr.js
var anyAttr = 'typescript';
console.log(anyAttr.name);
console.log(anyAttr.name.firstName);
複製代碼

再看方法

// anyFn.ts
let anyFn: any = 'typescript';
anyFn.setName('ts');
anyFn.name.setName('name');
複製代碼

編譯後數組

// anyFn.js
var anyFn = 'typescript';
anyFn.setName('ts');
anyFn.name.setName('name');
複製代碼

可推斷,聲明一個變量爲任意值以後,對它的任何操做(屬性和方法),返回的內容的類型都是任意值(就這麼無限下去)markdown

問(猜):那指定了類型是 any 和什麼類型都不指定是否是一個意思?函數

// anyNothing.ts
let anyNothing: any;
anyNothing = 'pr';
anyNothing = 30;

let anyNothing1;
anyNothing1 = '江湖再見';
anyNothing1 = 18;
複製代碼

編譯後oop

// anyNothing.js
var anyNothing;
anyNothing = 'pr';
anyNothing = 30;
var anyNothing1;
anyNothing1 = '江湖再見';
anyNothing1 = 18;
複製代碼

下個粗魯的結論,就是同樣的(變量在聲明時未指定其類型,那就默認指定爲任意值類型)

Never

表示永不存在的值的類型。使用場景有

  • 拋出異常;
  • 不會有返回值的函數表達式或箭頭函數表達式的返回值類型;
  • 變量;
// never.ts

// 返回 never 的函數必須存在沒法達到的終點
function error(message: string): never {
    throw new Error(message);
}

// 推斷的返回值類型爲 never
function fail() {
    return error("有錯");
}

// 返回 never 的函數必須存在沒法達到的終點
function infiniteLoop(): never {
    while (true) {
        // doSomething
    }
}

function log(): never {
    console.log('日誌')
}

function ok(): never {
    return '一切正常';
}
複製代碼

編譯前

編譯後

但仍是編譯出來了

// never.js

// 返回 never 的函數必須存在沒法達到的終點
function error(message) {
    throw new Error(message);
}
// 推斷的返回值類型爲 never
function fail() {
    return error("有錯");
}
// 返回 never 的函數必須存在沒法達到的終點
function infiniteLoop() {
    while (true) {
        // doSomething
    }
}
function log() {
    console.log('日誌');
}
function ok() {
    return '一切正常';
}
複製代碼

Object

表示非原始類型(也就是除 numberstringbooleansymbolnullundefined 以外的類型)。

那下面例子說明,在使用 object 的時候,能夠理解爲 Object.createObj 這樣使用。

// object.ts
declare function createObj(o: object): void;

createObj({ name: "typescript" });
createObj(undefined);
createObj(null);

createObj('ts');
createObj(30);
createObj(false);
複製代碼

編譯前

編譯後

但仍是編譯出來了

// object.js
createObj({ name: "typescript" });
createObj(undefined);
createObj(null);
createObj('ts');
createObj(30);
createObj(false);

複製代碼

注:關鍵字 declare 是用來聲明變量,在這裏只是一個輔助,後面會有對它作詳細說明。

通過測試,null{ name: "typescript" } 是對象,因此沒有什麼問題,undefind 也沒問題,個人理解是它是任何類型的子類型(固然也是 object 的子類型)。至於剩下的 3 個有問題已經很明顯了。

補充說明

本想將數組類型函數類型放在這裏的,但考慮到如下兩點,因此會單獨整理成 2 篇內容。

  • 會使得本篇篇幅過長;
  • 數組類型和函數類型介紹時會牽扯其餘概念,因此所牽扯到的概念會在這兩篇內容前介紹;

不知正在閱讀的你是否贊同個人這種思路和書寫方式?請留言...

本次代碼 Github

你能夠...

上一篇:Typescript 基礎類型

下一篇:Typescript 類型推論

目錄:Typescript 小書之入門篇

相關文章
相關標籤/搜索