TS-搬砖笔记

224 阅读2分钟

自带类型

  • 字符串
  • 数字
  • boolean
  • 数组
  • 元组 [number, string, object],长度,固定位置的类型都定死了
  • 枚举 enmu demo { A,B,C,D }
  • null
  • undefiend
  • never
  • void
  • object
  • any
  • symbol
  • bigInt
  • ts文件没有导出就是全局的,有导出就是局部。避免跟全局的命名冲突,得有导出,哪怕导出个空对象,都能把该ts的声明变成局部的
  • 还可以直接写字面量类型 const dir: 'up' | 'down'

函数

const arrow : (a?: string,b = 1:number) => string = (a, b) => a + b
function abc(a: string,bL number): string {}

obj!.a!.b
obj?.a?.b
abc ?? 234

as断言

  • constrctor 中的修饰符的含义是将这个属性定义在this上
  • 或者直接声明
eg:
class A {
  public x: number;
  constructor(x: number, public y) {
    console.log(this.x, this.y);
  }
}

内置类型 & 条件类型

  • a | b | c在ts里,是分别用a、b、c替换整个表达式,然后再把结果用|连起来
  • Exclude Extract Omit Pick Required Readonly Record Partial NonNullable
  • extends infer keyof typeof in
  • infer就理解为占位即可(起个名字方便返回)
type Exclude<T, U> = T extends U ? never : T;
type MyExclude = Exclude<string | number | boolean, boolean>;//string | number

type Extract<T, U> = T extends U ? T : never;
type MyExtract = Extract<string | number | boolean, boolean> // boolean
-> string extends boolean ? boolean : never
-> number extends boolean ? boolean : never
-> boolean extends boolean ? boolean : never
type ReturnType<T extends (...args: any[]) => any> = T extends (...args: any[]) => infer X ? X : never
type Parameters<T extends ((...args: any[]) => any)> = T extends ((...args: infer P) => any) ? P : never

// 构造函数
{new (...args:any[]):any}
type ConstructorParameters<T extends {new (...args:any[]):any}> = T extends {new (...args:infer C):any}?C:any
type InstanceType<T extends {new (...args:any[]):any}> = T extends {new (...args:any[]):infer R}?R:any


type Partial<T> = { [K in keyof T]?: T[K] }
type DeepPartial<T> = { [K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K] }
type Pick<T, K extends keyof T> = { [X in K]: T[X] }

// 必填 -? , 减去-可选?,不就是必填?
type Required<T> = { [K in keyof T]-?: T[K] }
type Readonly<T> = { readonly [K in keyof T]: T[K] }
type Omit<T,K extends keyof any> = Pick<T,Exclude<keyof T,K>>;

模块

declare 里面的内容 不需要导出 也不需要在增加declare,已经是全局的了

杂记

1) 接口默认会合并 可以给已有的属性合并属性或者方法
(其实这个好使,比如给pinia注入全局router跟route的时候,就得增加那俩属性的声明)
2) 类和命名空间可以合并 
3) 函数和命名空间可以合并
4) 枚举和命名空间可以合并 
>  表达式都没法合并 ----
5) 交叉类型合并数据

模块引入

 1.默认先查找node_modules  package.json types字段 有说明直接就找到了
 2.找对应包下有没有 index.d.ts 如果没有说明此包没有用ts来写
 3.找@types下的文件来查找 index.d.ts 
 4.tsconfig paths
 5.查找tsconfig include 目录下的文件 、 或者全局下所有的 .d.ts文件

之前没理解类型保护

  • 原来是ts会根据代码逻辑,判断类型从而不报错
function getVal(val: string | number) {
    if (typeof val === 'string') {
        val.padStart
    } else {
        val.toFixed
    }
}