1. TypeScript 中的问号 ? 与感叹号 !的含义
1.1 ?(问号)操作符
在 TypeScipt
里面,有4个地方会出现问号操作符,他们分别是:
三元运算符
const a = isNumber(input) ? input : String(input);
参数
// 这里的 ?表示这个参数 field 是一个可选参数 function getUser(user: string, field?: string) { }
成员
// 这里的?表示这个name属性有可能不存在 class A { name?: string } interface B { name?: string }
安全链式调用
// 这里 Error对象定义的stack是可选参数,如果这样写的话编译器会提示 // 出错 TS2532: Object is possibly 'undefined'. return new Error().stack.split('\n'); // 我们可以添加?操作符,当stack属性存在时,调用 stack.split。若stack不存在,则返回空 return new Error().stack?.split('\n'); // 以上代码等同以下代码 const err = new Error(); return err.stack && err.stack.split('\n');
1.2 !(感叹号)操作符
在TypeScript
里面有3个地方会出现感叹号操作符,他们分别是:
一元运算符 (取反)
const a = !isNumber(input);
成员
// 因为接口B里面name被定义为可空的值,但是实际情况是不为空的,那么我们就可以 // 通过在class里面使用!,重新强调了name这个不为空值 class A implemented B { name!: string } interface B { name?: string }
强制链式调用
// 这里 Error对象定义的stack是可选参数,如果这样写的话编译器会提示 // 出错 TS2532: Object is possibly 'undefined'. new Error().stack.split('\n'); // 我们确信这个字段100%出现,那么就可以添加!,强调这个字段一定存在 new Error().stack!.split('\n');
// hasRoute(a:RouteRecordName); to.name的类型可能为:RouteRecordName | undefined | null 则会报错 // 通过 ! 强制处理不为空 const hasRoute = router.hasRoute(to.name!);
2. TS高级类型 Partial 使用
借鉴:
Partial
将T中的所有属性设置为可选
<!-- 源码 --> type Partial<T> = { [P in keyof T]?: T[P]; };
keyof T
获取T
的所有属性?
可选参数interface IPeople { name:string, age?: number, sex: string, } type TPartial = Partial<IPeople> // 等同于 type TPartial = { name?: string | undefined; age?: number | undefined; sex?: string | undefined; }
TypeScript中的keyof、typeof、索引访问类型、条件类型
评论区