基础类型 -- 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[] = [];
复制代码
相关文章
相关标签/搜索