Typescript相较于JavaScript有什么优势和劣势?
- ts可以在写代码的时候给予很好的提示。
- 静态类型化是一种功能,可以在开发人员编写脚本时检测错误,有了这项功能,就会允许开发人员编写更健壮的代码并对其进行维护,以便使得代码质量更好、更清晰。
- ts引入了类中属性和方法的权限,可以实现对类的封装。
- ts运行时,只能先编译成js,才能在浏览器或者node上运行。
- ts不灵活。这一点也是他的优点吧。
const func = (a, b) => a + b; 要求编写Typescript,要求a,b参数类型一致,都为number或者都为string
- 如何保证a, b类型相同,就需要使用泛型。
- 如果返回不同类型的值。使用类型保护
function func<T>(a: T, b: T) { if (typeof a === 'string' && typeof b === 'string') { return `${a}${b}` } else if (typeof a === 'number' && typeof b === 'number') { return a + b } }
实现ReturnType
type MyReturnType<T extends (...arg: any) => any> = T extends ( ...arg: any ) => infer RT ? RT : never
infer RT
代表待推断的返回值类型,如果 T
是一个函数(...args: any[]) => infer RT
,则返回函数的返回值 RT
,否则返回never
。infer关键字,解释
实现DeepReadOnly
先来实现浅层只读吧
type ShallowReadOnly<T> = { // 只有在泛型中才可以使用extends readonly [key in keyof T]: T[key] }
其实深度只读,就是判断T[key]是否是object类型。
type DeepReadonly<T> = { readonly [key in keyof T]: T[key] extends object ? DeepReadonly<T[key]> : T[key] }
基于已有类型生成新类型:剔除类型中的width属性
interface A { content: string; width: number; height: number; }
这里的keyof语法是获取接口键名的类型。如果是key是string类型,那么接收的类型可以是string或者number类型