與 js 相同,ts 的原始類型包括布爾值,數值,字符串,undefined
,null
以及object
,symbol
。javascript
布爾類型是最基礎的數據類型,只包含true/false
的值,使用boolean
表示該類型:html
const isDone: boolean = true;
const isLoading: boolean = false;
複製代碼
若是爲一個布爾類型的變量賦true/false
之外的值,將會報錯(這裏就能體現出 typescript 類型定義的好處):java
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
類型的變量還能夠被賦值NaN
和Infinite
。json
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
表明任何不是boolean
,number
,string
,symbol
,undefined
,null
類型的值。
const obj: object = {};
const array: object = [];
複製代碼
symbol
是 es6 新增的基礎類型,關於symbol
語法使用能夠查看阮一峯大佬的 Symbol 文章,注意:使用symbol
時,須要在tsconfig.json
文件中添加ES2015
編譯輔助庫。
{
"compilerOptions": {
"lib": [
"ES2015"
]
}
}
複製代碼
const s: symbol = Symbol();
複製代碼
在 ts 中,undefined
和null
都有各自對應的類型,分別叫作undefined
和null
。
const u: undefined = undefined;
const n: null = null;
複製代碼
自己類型的做用並不大。可是undefined
和null
是全部類型的子類型,就這意味着它們能夠賦值給其餘全部類型,如number
類型的變量能夠賦值爲undefined
。這一般不是咱們所指望的,在正式項目開發中,建議開啓strictNullChecks
。
{
"compilerOptions": {
"strictNullChecks": true
}
}
複製代碼
開啓後,undefined
和null
只能賦值給any
類型的變量,或者它們自身的類型(此時,undefined
仍是能夠賦值給void
,這是一個例外)。
const v: void = undefined;
const a1: any = undefined;
const a2: any = null;
複製代碼
在 js 中沒有空值(void
)的概念,在 ts 中可用void
表示沒有返回值的函數,該類型自己沒有什麼用。由於它只能賦值爲undefined
或null
。
const v1: void = null;
const v2: void = undefined;
function foo(): void {
console.log("foo");
}
複製代碼
若是開啓strictNullChecks
, void
類型變量只能被賦值爲undefined
。
ts 中用any
表示任意類型,即any
類型的變量的使用方法和 js 中的變量如出一轍。在引用一些 js 所寫的第三方庫時,或者開發時還不狀況當前變量的具體類型時,均可以用any
類型的變量。
let val: any = true;
val = "string";
val = 1;
複製代碼
過分使用any
類型會把 typescript 變成 anyscript,這樣會失去類型保護的意義。一般狀況下,不該該使用any。
在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
(它自身除外)。該類型自己沒什麼做用,實際開發業務也不多用到,多用於類型編程中。
比較常見的場景:
// 函數拋出錯誤,沒有任何返回值
function error(message: string): never {
throw new Error(message);
}
// 永遠不會終止的函數
function infiniteLoop(): never {
while (true) {}
}
// 永遠爲空的數組
const empty: never[] = [];
複製代碼