类型

TypeScript的类型有很多,然而这里不会逐个进行解说。上面列出来的几种类型,有的你可能没听过、有的你可能没用过、有的你可能用过然而不晓得含意、有的你可能晓得含意然而不能和其余类型辨别···

Symbol

ES6 引入了一种新的原始数据类型 Symbol ,示意举世无双的值,它是 JavaScript 语言的第七种数据类型。

应用 Symbol() 函数咱们能够申明一个 Symbol 变量,留神不能应用 new 命令,因为它是原始数据类型;Symbol 函数也能够承受一个字符串作为参数,次要是不便当 Symbol 转化为字符串时,比拟容易辨别,该传入的参数在 ES2019 中反对通过 description 这个实例属性来拜访。

Tuple(元组)

家喻户晓,对象、数组、枚举类型能够寄存多个数据;然而,对象和枚举寄存的数据以key/value模式存在,不具备排序等特效,数组中寄存的只能是同一类型数据;Tuple类型能够看做是对象类型和数组类型特点的联合:

  • 数据有序;
  • 寄存不同类型数据;

在 JavaScript 中是没有元组的,元组是 TypeScript 中特有的类型,其⼯作⽅式相似 于数组。 元组可⽤于定义无限数量的未命名属性的类型。每个属性都有⼀个关联的类型。使⽤元组时,必须 提供每个属性的值,能够通过索引拜访元素:

let tupleType: [string, boolean, number];tupleType = ["hello", true, 2];console.log(tupleType[0]); // helloconsole.log(tupleType[1]); // trueconsole.log(tupleType[2]); //2

any(任意类型)

在 TypeScript 中,任何类型都能够被归为 any 类型。这让 any 类型成为了类型零碎的顶级类型(也被 称作全局超级类型)。

any 类型实质上是类型零碎的⼀个避难所,这给了开发者很⼤的⾃由:TypeScript 容许咱们 对 any 类型的值执⾏任何操作,包含赋值和被赋值,并且⽆需当时执⾏任何模式的查看。⽐如:

let value: any;// 被赋值value = 'hello world';value = true;value = [];value = {};value = 0;// 赋值给其余变量let temp: number;temp = value;// 操作属性/办法value.toString();value.length;value();
  • any能够为任何类型,所以默认变量上的任何属性或者办法都能够找到一个类型(根底类型/自定义类型)对应上,所以查看没有问题;

unknown(不晓得什么类型)

就像所有类型都能够赋值给 any ,所有类型也都能够赋值给 unknown 。这使得 unknown 成为 TypeScript 类型零碎的另⼀种顶级类型(另⼀种是 any );

对 value 变量的所有赋值都被认为是类型正确的。然而,尝试将类型为 unknown 的值赋值给其 他类型的变量时就会有意想不到的限度:

let value: unknown;// 被赋值value = 'hello world';value = true;value = [];value = {};value = 0;// 赋值给其余变量let temp: number;  // Error:Type 'unknown' is not assignable to type 'number'.temp = value;let temp2: any;temp2 = value; // Successlet temp3: unknown;temp3 = value; // Successlet temp4: string[]; // Error:Type 'unknown' is not assignable to type 'string[]'temp4 = value;// 操作属性/办法value.toString(); // Error:Object is of type 'unknown'value.length; // Error:Object is of type 'unknown'value(); // Error:Object is of type 'unknown'
  • unknown 类型只能被赋值给 any 类型和 unknown 类型自身:可能保 存任意类型值的容器能力保留 unknown 类型的值。
  • value 变量类型为 unknown ,进行查看的时候无奈确认变量类型,因而认为变量上的办法或者属性都是不确定的,查看不给通过。

void(没有任何类型)

void能够了解为和any正好相同,示意没有任何类型,void个别用于一个函数没用返回值时。当给一个变量定义为void类型时是没有任何作用,变量的值只能是undefined

let value:void;value = 0; // Error:Type 'number' is not assignable to type 'void'.value = undefined; // Success

null(空值类型)和 undefined(未定义类型)

TypeScript ⾥, undefined 和 null 两者有各⾃的类型的值别离为 undefined 和 null ,并且只能是 undefined 和 null:

let value:null;value = undefined;  // Error:Type 'undefined' is not assignable to type 'null'value = null; //Successvalue = 1; // Error:Type '1' is not assignable to type 'null'let value:undefined;value = undefined; //Successvalue = null; // Error:Type 'null' is not assignable to type 'undefined'value = 1; // Error:Type '1' is not assignable to type 'undefined'

Object、object和{}(对象类型)

# TypeScript中如何应用Object、object和{}?

Never

never 类型示意不存在的值的类型。never 类型用于:

  • 抛出异样
  • 不会有返回值的函数表达式或箭头函数表达式的返回值类型(无起点,始终执行上来!)。
function error(msg: string)msgever {         throw new Error(msg);}function loop(): never {         while (true) {                 // 始终执行上来         }}

使⽤ never 避免出现新增了联结类型没有对应的实现,⽬的就是写出类型相对平安的代码;能够利⽤ never 类型的个性对变量类型全⾯性查看:

// 定义type a为string或者number类型type a = string | number;// 办法checkWithNever用来检测参数是否是type a,function checkWithNever(foo: a) {    if (typeof foo === "string") {        // 这⾥执行 string 类型的操作    } else if (typeof foo === "number") {        // 这⾥执行 number 类型的操作    } else {        // 在这⾥是 never用来接管非type a的类型,并且会在编译时报错        const check: never = foo;    }}// 重写 type a类型,然而没有批改checkWithNever,导致boolean 类型,⽆法赋值给 never 类型,执行后编译报错type a = string | number | boolean;const c: a = true;checkWithNever(c); // Type 'boolean' is not assignable to type 'never'. // 'check' is declared but its value is never read.