ts练习
基本认识
在ts的世界中,将类型作为变量一样使用,进行定义。
在变量赋值时,进行类型检查,相当于js世界中的函数运行
在 type中使用泛型,类似于函数传参
(1) —— 第二题
// 1. 使用函数重载对函数参数和返回值进行限定,保证了类型的一致
function f(a: string, b: string):string;
function f(a: number, b:number): number;
function f(a: string | number, b: string | number) {
// 2. 使用类型保护,对类型进行了范围的限定
if (typeof a === 'string' || typeof b==='string') {
return a + ':' + b; // no error but b can be number!
} else {
return a + b; // error as b can be number | string
}
}
f(2, 3); // Ok
f(1, 'a'); // Error
f('a', 2); // Error
f('a', 'b') // Ok
一、函数重载
对函数的参数和返回值,执行了更加细化的限定
二、类型保护
使用js中的instanceof、typeof对变量类型进行判断,从而划定变量的类型范围
(2) —— 第五题
type AppendArgument<F extends (...args: any[]) => any, X> = (x: X, ...args: Parameters<F>) => ReturnType<F>;
一、(...args: any[]) => any
函数的基本通用类型
二、Parameters
获取一个函数类型的参数类型
三、ReturnType
获取一个函数类型的返回值类型
ReturnType<Type>
type MyType<T extends (...args: any) => any> =
T extends (...args: any) => infer R ? R : any;
Parameters<Type>
type MyParamsType<T extends (...args: any) => any> =
T extends (...args: infer P) => any ? P : never;
(3) —— 第六题
type DeepFlat<T extends any[]> = {
[K in keyof T]: T[K] extends any[] ? DeepFlat<T[K]> : T[K]
}[number]
一、extends
类型断言,有点类似于三元表达式,AType extends BType ? CType : DType Aype类型是否属于BType,若属于推断AType类型为CType类型,否则为DType类型
二、利用数组的下标是number类型的特性
三、思路有点类似于深拷贝,type DeepFlat类似于函数,泛型类似于传参
(4) —— 第七题
type EmptyObject = {
// type PropertyKey = string | number | symbol
[K in PropertyKey]: never
}
// 不明白这样为什么不可以???
type A<T extends object> = {
[K in keyof T]: never}
一、认识never
never表示不存在的类型,定义类型时,可以使用never限定类型的范围。never可以赋给任何类型(定义时),但任何值的类型都不匹配never类型(赋值,类型检查时,会进行报错) 二、认识PropertyKey 认识到PropertyKey指的是 type PropertyKey = string | number | symbol 囊括了js中所有变量的key的类型
(5) —— 第十二题
type Head<T extends Array<any>> = T extends [] ? never : T[0];
使用了extends的类型推断,排除了空数组的情况
总结心得
这次练习的并不多,但也算重新认识了ts,对ts有了一些新的认知。也了解到了很多ts中的内置类型,比如说ReturnType、PropertyKey、Parameters等。总的来说,还是收获很大,但是也清楚认识到自己ts还是很不熟练,几乎都写不出答案,需要看着答案去理解,查找相关知识点再进行学习。哈啊哈,路还很长,还需要多加学习进步😀