type str = StringConstructor;
type s = str extends { (): infer R } ? R : never;
同上题,从 constructor 推导出对应的实例代码如下
class ClassA {}
type str = StringConstructor;
type classA = typeof ClassA;
type InstanceType<T> = T extends
| (() => infer R)
| {
new (...args: any[]): infer R & object;
}
? R
: any;
type some = InstanceType<str>;
type typeClassA = InstanceType<classA>;
如何取出一个数组的通用类型
type testNumber = (string | number) [];
type t = testNumber[number] // string | number
实现一个 isAny
type isAny<T> = 0 extends (1 & T) ? true : false; // 利用 any & 任何东西都等于 any 的特性来处理
类型推断
假设我有一堆类型,type 是唯一标识,要通过 type 来推出具体的类型
type Type = 'a' | 'b';
interface IInputType {
a: string;
b: number;
}
type IT<T extends Type = Type> = T extends Type ? {
type: T;
h: IInputType[T];
} : any;
const t:IT = {
type: 'a',
h: 'asd'
}
const h:IT = {
type: 'b',
h: 123
}
Enum
Enum 在编译后,会变成一个对象,key 和 value 都会变成编译对象的 key
编译后
为什么有时候通过对象的方式将一个 'right' 赋给 'right' | 'left' 的时候报错
原因:因为 ts 在进行类型推导的时候,会尝试进行【类型拓宽】,故意推导出一个更宽泛的类型。修复的方法就是告诉 Typescript,这里的 'right' 是个常量,不要在传递的过程中将其理解为 string 类型。
ThisType
这个玩意可以用来声明对象的函数的 this 指针类型
联合类型遍历的方式
从StringConstructor 变成 string(StringConstructor 可以切换为其他基本类型的构造器)
同上题,从 constructor 推导出对应的实例代码如下
如何取出一个数组的通用类型
实现一个 isAny
类型推断
假设我有一堆类型,type 是唯一标识,要通过 type 来推出具体的类型
通过 extends 的类型推导功能,比如通过 extends,变为
之后,在通过实际写的 type, ts 可以根据这个推导出这个类型属于 前者还是后者。
扩展全局变量
比如想扩展 Window 类型,可以这样写