@ts-check 给js点类型看看!

版权声明:欢迎转载,但请注明出处 https://blog.csdn.net/HaoDaWang/article/details/81119840

@ts-check 给js点类型看看!

js的动态类型一直是让人头疼的问题,特别是项目大了之后,难受的类型方面的错误会加大debug的强度,很难被发现。另一方面就是关于性能的方面,js的解释器在进行解释的时候会不断的将你的代码的类型进行推断,比如:

let x = 1
x = 'a'

这样是在js里是没有任何问题的,但是解释器解释的时候,看到let x = 1,心想,那x肯定就是number类型了,下面赋值字符a,不对,那应该是string类型了,然后又重新开辟一块内存放入a,这样做是很不好的。嗯,自然有解决方法,比如,微软家的Typescript。ts实在是解决js动态类型的好手,ts是一门静态语言,是js的超集。学习曲线也很平缓。但是如果我们现在已经有了一个项目,项目已经很大了, 意识到js的动态类型带来许多类型上的错误,实在使得开发过程,debug过程都很不愉快,于是想着用ts来重构,这将是一件极为痛苦的事情,要把那么多的代码按照ts的标准重构,不仅花费大量的时间,甚至还需要大量的精力。

有没有一种不改变现有的代码结构的方法,来使得我们避开动态类型的坑呢?答案是能行的,不妨试试@ts-check,在文档的开头打上单行注释//@ts-check,是不是很简单。再搭配上vscode,在违反一些类型上的错误的时候,vscode会帮助你勘测到错误在哪儿,虽然运行还是能运行,但是实际上开发的逻辑层面已经被类型给规范了。 还是刚刚那个例子

//@ts-check
/*
*@type {number}
*/
let x = 1
x = 'a'

马上编辑器就会告诉你错误

[ts] 不能将类型“"a"”分配给类型“number”。
let x: number
@type — {number}

这种例子还有很多,看一个稍微复杂点的例子

class Person{
  /**
   * @param {string} name
   * @param {number} age\
   */
  constructor(name, age){
    this.name = name
    this.age = age
  }

  /**
   * @protected
   * @abstract
   * @return {void}
   */
  sayIdentity(){
    throw new Error("Must be impelemnts this Method")
  }
}

/**
 * @extends Person
 */
class Student extends Person{

  /**
   * @property {string} sid
   */

  /**
   * @param {string} name
   * @param {number} age
   * @param {string} sid
   */
   constructor(name, age, sid){
    super(name, age)
    this.name = name
    this.age = age
    this.sid = sid
  }

  sayHello(){
    console.log("hello")
  }

  /**
   * @param {string} content
   */
  saySomething(content){
    console.log(content)
  }

  answer(){
    return "this is answer"
  }

  /**
   * @override sayIdentity
   */
  sayIdentity(){
    console.log(`
      hello my name is ${this.name},
      i'm ${this.age} years old,
      and i'm student id is ${this.sid}
    `)
  }
}

let xiaoming = new Student("xiaoming", 19, "10003")
xiaoming.saySomething("this is content")
xiaoming.sayIdentity()

通过@extends可以说明子类继承的父类,比如还可以通过@param说明参数的类型,@return说明返回值,@abstract说明抽象的方法或者类…你可能发现了,这不就是JSDOC吗??是的,语法就是JSDOC,因此,我们还能通过JSDOC来生成一些文档,来说明自己的代码,尤其是你开发了一堆的API来供别人使用的时候,那将是一份很好的说明文档

关于只是在编辑器提供错误,而还是能运行的问题

编辑器提供的错误在于你编写代码的时候,会给你提供类型,但是在运行的时候并没有类型,因此,就算是不同类型的强制赋值,也还是能运行的。那我们为什么要这么做?我们应该把重点放在运行之前,在开发的时候就可以避免一些坑。类型终归也只是存在于编译期,由代码编辑器,IDE提供还是由编译器提供类型检查都是无关紧要的

猜你喜欢

转载自blog.csdn.net/HaoDaWang/article/details/81119840
今日推荐