Top Type

  • any

    • 会跳过类型检查器对值的检查,任何值都可以赋值给any类型,any类型的值也可以赋值给任何类型
    • 可以给一个any类型的变量赋值任何的值,比如数字、字符串的值;
    const arr: any[] = ["111", 234] //不推荐
  • unknown

    • 它用于描述类型不确定的变量
    • 任何类型的值都可以赋值给unknown类型,但unknow类型只能赋值给any和unknown类型
    • any类型可以赋值给任意类型
let notSure: unknown = 4;
let uncertain: any = notSure; // OK

let notSure: any = 4;
let uncertain: unknown = notSure; // OK

let notSure: unknown = 4;
let uncertain: number = notSure; // Error

Bottom Type

  • never
    • 整个类型系统层级中最底层的类型
    • 和 null、undefined 一样,它是所有类型的子类型,但只有 never 类型的变量能够赋值给另一个 never 类型变量。
    • 表示那些永不存在的值的类型
    • 函数中是一个死循环或者抛出一个异常
function justThrow(): never {
throw new Error()
}

类型断言:警告编译器不准报错

  • 通常这会发生在你清楚地知道一个实体具有比它现有类型更确切的类型。
    • 在 TypeScript 类型分析不正确或不符合预期时,将其断言为此处的正确类型
  • 类型断言好比其它语言里的类型转换
  • 两种方式实现
//在 TypeScript 看来,greaterThan2 的类型既可能是数字,也可能是 undefined,所以上面的示例中提示了一个 ts(2322) 错误,此时我们不能把类型 undefined 分配给类型 number
const arrayNumber: number[] = [1, 2, 3, 4];
const greaterThan2: number = arrayNumber.find(num => num > 2); // 提示 ts(2322)

// 尖括号 语法
let someValue: any = "this is a string";
let strLength: number = (<string>someValue).length;

// as 语法
let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;

非空断言!

  • 排除 null undefined
function printMessageLength(message?: string) {
// vue3源码
console.log(message!.length) //message! 非空
}

printMessageLength("aaaa")
  • 确定赋值断言
    • let x!: number; 确定赋值断言,TypeScript 编译器就会知道该属性会被明确地赋值。
let x!: number;
initialize();
console.log(2 * x); // Ok

function initialize() {
x = 10;
}

双重断言

  • 如果在使用类型断言时,原类型与断言类型之间差异过大,也就是指鹿为马太过离谱,离谱到了指鹿为霸王龙的程度,TypeScript 会给你一个类型报错:
const str: string = "Kylin";

// 从 X 类型 到 Y 类型的断言可能是错误的,blabla
(str as { handler: () => {} }).handler()

// 它会提醒你先断言到 unknown 类型,再断言到预期类型,就像这样:
const str: string = "Kylin";

(str as unknown as { handler: () => {} }).handler();

// 使用尖括号断言
(<{ handler: () => {} }>(<unknown>str)).handler();

类型层级

  • 最顶级的类型,any unknown
  • 特殊的 Object ,它也包含了所有的类型,但和 Top Type 比还是差了一层
  • StringBooleanNumber 这些装箱类型
  • 原始类型与对象类型
  • 字面量类型,即更精确的原始类型与对象类型嘛,需要注意的是 null undefined 并不是字面量类型的子类型
  • 最底层的 never