基礎類型 -- Typescript基礎篇(2)

與 js 相同,ts 的原始類型包括布爾值,數值,字符串,undefinednull以及objectsymboljavascript

布爾類型

布爾類型是最基礎的數據類型,只包含true/false的值,使用boolean表示該類型:html

const isDone: boolean = true;
const isLoading: boolean = false;
複製代碼

若是爲一個布爾類型的變量賦true/false之外的值,將會報錯(這裏就能體現出 typescript 類型定義的好處):java

boolean-type-error

ts 中有不少針對於原始類型的構造方法,如:對 boolean 類型來講是 Boolean, 若是使用 Boolean 構造函數生成的變量,其類型並非 boolean。請注意類型的大小寫 es6

// 這是錯誤的用法,此時的val是Boolean類型
const val: boolean = new Boolean(true);
複製代碼

數值類型

ts 中的全部數字都是浮點數,其類型爲number,而且支持十進制,二進制,八進制,十六進制。typescript

const decimalNumber: number = 6; //十進制
const binaryNumber: number = 0b11; //二進制
const octalNumber: number = 0o11; //八進制
const hexNumber: number = 0xfff; //十六進制
複製代碼

將會被編譯成:編程

var decimalNumber = 6; //十進制
var binaryNumber = 3; //二進制
var octalNumber = 9; //八進制
var hexNumber = 0xfff; //十六進制
複製代碼

除此以外,number類型的變量還能夠被賦值NaNInfinitejson

const nanNumber: number = NaN;
const positiveInfiniteNumber: number = Infinity;
const negativeInfiniteNumber: number = -Infinity;
複製代碼

針對大數值,可使用_鏈接數值加強可讀性:數組

const value: number = 1_1234_0000;
複製代碼

該數字會被編譯成:安全

var value = 112340000;
複製代碼

字符串類型

ts 使用string表示字符串,而且支持模板字符串格式。函數

const str1: string = "blue";
const str2: string = `${str1}, yellow, red`;
複製代碼

Object

object表明任何不是booleannumberstringsymbolundefinednull類型的值。

const obj: object = {};
const array: object = [];
複製代碼

Symbol

symbol是 es6 新增的基礎類型,關於symbol語法使用能夠查看阮一峯大佬的 Symbol 文章注意:使用symbol時,須要在tsconfig.json文件中添加ES2015編譯輔助庫

{
  "compilerOptions": {
    "lib": [
      "ES2015"
    ]
  }
}
複製代碼
const s: symbol = Symbol();
複製代碼

Undefined and Null

在 ts 中,undefinednull都有各自對應的類型,分別叫作undefinednull

const u: undefined = undefined;
const n: null = null;
複製代碼

自己類型的做用並不大。可是undefinednull是全部類型的子類型,就這意味着它們能夠賦值給其餘全部類型,如number類型的變量能夠賦值爲undefined。這一般不是咱們所指望的,在正式項目開發中,建議開啓strictNullChecks

{
  "compilerOptions": {
    "strictNullChecks": true 
  }
}
複製代碼

開啓後,undefinednull只能賦值給any類型的變量,或者它們自身的類型(此時,undefined仍是能夠賦值給void,這是一個例外)。

const v: void = undefined;
const a1: any = undefined;
const a2: any = null;
複製代碼

Void

在 js 中沒有空值(void)的概念,在 ts 中可用void表示沒有返回值的函數,該類型自己沒有什麼用。由於它只能賦值爲undefinednull

const v1: void = null;
const v2: void = undefined;

function foo(): void {
  console.log("foo");
}
複製代碼

若是開啓strictNullChecks, void類型變量只能被賦值爲undefined

Any

ts 中用any表示任意類型,即any類型的變量的使用方法和 js 中的變量如出一轍。在引用一些 js 所寫的第三方庫時,或者開發時還不狀況當前變量的具體類型時,均可以用any類型的變量。

let val: any = true;
val = "string";
val = 1;
複製代碼

過分使用any類型會把 typescript 變成 anyscript,這樣會失去類型保護的意義。一般狀況下,不該該使用any。

Unknown

3.0 新引入了 unknown,它至關因而any對應的安全類型。與any的主要區別:

  • any類型的變量能夠賦值給其餘類型的變量,unknown只能賦值給unknown或者any在未作類型斷言前
  • 在對unknown變量進行操做前,必須進行類型斷言,而any不須要
let unknown1: unknown;
const unknown2: unknown = unknown1;
const any1: any = unknown1;

// Error
// Type 'unknown' is not assignable to type 'number'.ts(2322)
// const num: number = unknown1;
複製代碼
if (typeof unknownVal === "string") {
  unknownVal.toUpperCase();
}

// Error
// Object is of type 'unknown'.ts(2571)
// unknownVal.toUpperCase();
複製代碼

Never

never表示永不存在的值,它是任何類型的子類型,便可以賦值給任意類型。然而,沒有任何類型是它的子類型,這意味着沒有任何類型的值能夠賦值給never(它自身除外)。該類型自己沒什麼做用,實際開發業務也不多用到,多用於類型編程中。

比較常見的場景:

// 函數拋出錯誤,沒有任何返回值
function error(message: string): never {
  throw new Error(message);
}

// 永遠不會終止的函數
function infiniteLoop(): never {
  while (true) {}
}

// 永遠爲空的數組
const empty: never[] = [];
複製代碼
相關文章
相關標籤/搜索