看了涡流大佬的面试文章的总结(Typescript)

1,255 阅读2分钟

本人目前大三,4月末进行了人生第一场面试。不尽人意。总觉得自己什么都了解,但是又觉得什么都不会。前几天看见涡流老哥的面试文章总结。来进行一些总结吧。

涡流老哥原博文。前端两年经验,历时一个月的面经和总结

有些的不对的地方,请指正,一起总结。

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,否则返回neverinfer关键字,解释

实现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类型

你可以看一下这篇文章