進階類型也是我自定義的,主要區別於上篇文章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');
複製代碼
可推斷,聲明一個變量爲任意值以後,對它的任何操做(屬性和方法),返回的內容的類型都是任意值(就這麼無限下去)。函數
問(猜):那指定了類型是
any
和什麼類型都不指定是否是一個意思?oop
// anyNothing.ts
let anyNothing: any;
anyNothing = 'pr';
anyNothing = 30;
let anyNothing1;
anyNothing1 = '江湖再見';
anyNothing1 = 18;
複製代碼
編譯後post
// anyNothing.js
var anyNothing;
anyNothing = 'pr';
anyNothing = 30;
var anyNothing1;
anyNothing1 = '江湖再見';
anyNothing1 = 18;
複製代碼
下個粗魯的結論,就是同樣的(變量在聲明時未指定其類型,那就默認指定爲任意值類型)。
表示永不存在的值的類型。使用場景有
// 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 '一切正常';
}
複製代碼
表示非原始類型(也就是除 number
,string
,boolean
,symbol
,null
或 undefined
以外的類型)。
那下面例子說明,在使用 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 篇內容。
不知正在閱讀的你是否贊同個人這種思路和書寫方式?請留言...