TS认识学习

142 阅读2分钟

ts练习

基本认识

在ts的世界中,将类型作为变量一样使用,进行定义。

在变量赋值时,进行类型检查,相当于js世界中的函数运行

在 type中使用泛型,类似于函数传参

(1) —— 第二题

github.com/semlinker/a…

// 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) —— 第五题

github.com/semlinker/a…

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) —— 第六题

github.com/semlinker/a…

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) —— 第七题

github.com/semlinker/a…

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) —— 第十二题

github.com/semlinker/a…

type Head<T extends Array<any>> = T extends [] ? never : T[0];

使用了extends的类型推断,排除了空数组的情况

总结心得

这次练习的并不多,但也算重新认识了ts,对ts有了一些新的认知。也了解到了很多ts中的内置类型,比如说ReturnType、PropertyKey、Parameters等。总的来说,还是收获很大,但是也清楚认识到自己ts还是很不熟练,几乎都写不出答案,需要看着答案去理解,查找相关知识点再进行学习。哈啊哈,路还很长,还需要多加学习进步😀