自带类型
- 字符串
- 数字
- 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
}
}