Typescript

any 和 unknown#

any 类型可以理解为我不在乎他的类型,而 unknown 类型可以理解为我不知道它的类型。

unknown 类型可以理解为类型安全的 any 类型。编译器会对 unknown 类型的变量提供类型检查,any 类型就不会。

function invokeCallback(callback: unknown) {
try {
// 可以通过增加类型判断避免报错
// if(typeof callback === 'function')
callback(); // Error
} catch (err) {
console.log(err);
}
}

extends 关键字#

extends 关键字在 TS 编程中出现的频率挺高的,而且不同场景下代表的含义不一样,特此总结一下:

  • 表示继承/拓展的含义
  • 表示约束的含义
  • 表示分配的含义

interface 和 type 的区别#

相同点#

  • 都可以用来定义对象和函数
interface example {
name: string;
age: number;
}
interface exampleFunc {
(name: string, age: number): void;
}
type example = {
name: string;
age: number;
};
type example = (name: string, age: number) => {};
  • 它俩也支持继承,并且可以互相继承。但是具体的形式稍有差别。

    interface 是通过 extends 实现的,type 是通过&实现的。

type aa = {
name: string;
};
interface bb {
name: string;
}
type cc = aa & {
age: number;
};
type cc = bb & {
age: number;
};
interface dd extends aa {
age: number;
}
interface dd extends bb {
age: number;
}

不同点#

  • 可以定义的类型:

interface 可以定义对象和函数。

type 可以定义 基本类型的别名,如 type myString = string;

type 可以通过 typeof 操作符来定义,如 type myType = typeof someObj;

type 可以申明 联合类型,如 type unionType = myType1 | myType2;

type 可以申明 元组类型,如 type yuanzu = [myType1, myType2]

  • 合并类型 interface 支持声明合并;type 不支持
interface Person {
name: string;
}
interface Person {
age: nmber;
}
// 形同
interface Person {
name: string;
age: nmber;
}
// type 重复声明会报错
type A = string;
type A = number;

高级类型#

  • Exclude
  • Extract
  • Omit
  • Pick