与 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[] = [];
复制代码