运用 Typescript 搜检你的代码范例

背景

越来越多的前端项目最先运用typescript这门静态搜检言语了,它包括许多很棒的功用点,在这里就不细述,依据静态语法搜检和.d.ts天生的代码提醒两大特征,我们就可以来制订而且搜检代码范例,如今我们来详细说一下。

代码范例

代码范例人人应该是从最先写第一行代码最先他人就最先和你说,要遵照xx代码范例。公司差别,范例的内容、情势、搜检体式格局也差别,但最终是要验收你的范例。
假如是经由历程leader code review体式格局来搜检代码,那效力也就太低了,最好的体式格局就是在GIT提交之前做搜检。你的代码分歧范例,提交都提交不上去,如许就能从入口上保证代码的范例性。
我们再说看下前端的代码范例状况,前端的代码重要就是js的代码,由于js的灵活性以及随意性,让东西来搜检代码的范例成为不可能,这也是我一向头疼的事,由于范例这类东西,说再多遍,不来点强制手段,组内之前也是不可能杀青一致的。直到Typescript的涌现,处理了这个题目。

Typescript搜检的道理

Typescriptjavascript的超集,所以ts在运转之前,得先编译成js,那末这个编译的历程,ts的编译引擎就得晓得,文件里包括哪些要领,要领包括哪些参数,各参数的定义是什么,范例是什么,总之,一切源信息必需都晓得,才准确无误的把ts翻译成js。这些东西也恰是我们须要的,经由历程这些信息,我们就可以对照范例和源信息,来确认是不是是相符我们制订范例的代码。

开端完成

顺着这个思绪,我查了查typescript的官方文档,果真找到了一个,叫做Compiler API,末了的谁人例子,是和我们的需求相干的,把代码拿下来,也是可以跑通的,所以呢,下一步,就是基于这个例子举行扩大,来满足我们本身的需求。
完成的历程,也是挺痛楚的,由于没有文档,也没有申明,幸亏在vscode可以点举行看声明文件,好消息是可以看到要领的定义,坏消息就是一切的要领的声明、范例,都没有解释,部份须要本身来猜,哈哈,有总比没有强,照猫画虎,总算完成了基本功用。

《运用 Typescript 搜检你的代码范例》

官方的.d.ts大抵就长如许

开辟当中,有一个题目比较难处理,就是在现在可观察的API中,只能constructor可以取到返回值范例,其他要领API基础不供应,末了借助stackoverflow上发问,处理了这个题目,有兴致的同砚可以参考下:how to use typescript Compiler API to get normal function info, eg: returnType/parameters?

搜检你的代码

如今已可以搜检你的代码了,我们上面也说了,最好的搜检机遇是开辟人员提交的时刻,这时会搜检一切的代码,只要一切的代码都相符范例,才会提交胜利,这是我们最理想的状况。
根据这个思绪,我们可以查到,Git有许多钩子,pre-commitcommit-msgpost-commit等等,我们运用pre-commit:提交前搜检,会实行.git/hooks/pre-commit下的剧本文件,然则这个文件散布在组内一切人的笔记本中,而且不能增添版本掌握。带着如许的疑问,我们找到了pre-commit这个神器,它的完成道理也是修正上面的文件,不过它从node层屏障了完成细节,我们只要在package.json内里增添一个script就可以完成我们要的功用。

设置大概是如许:

...
"pre-commit": ["commit"],
"script":{
    ...
    "commit": "ts-node verify.ts"
    ...
}
...

如许在git内里commit(不论运用命令行照样SourceTree如许图形界面)的时刻就会实行ts-node verify.ts,搜检假如失利了,就会把错误信息打印到掌握台上,而且提交会失利,直到一切的已定划定规矩都考证经由历程,才会提交胜利。

搜检失利,大抵就是如许的:

《运用 Typescript 搜检你的代码范例》

另有一个更大的作用

我们已经由历程上一步,可以搜检我们的范例了,晓得代码的一切信息,比方天生.d.ts文件!对一个对外供应的东西库来讲,假如没有一套完全的.d.ts文件举行代码提醒的话,那就显的太不专业了。假如要天生一个完全的提醒文件,就必须请求你的类、要领、参数、返回值都要有完全的解释,这些就应该在你的代码范例中。

我们来看一下,比较好的例子:

《运用 Typescript 搜检你的代码范例》

晓得了一切的信息,天生这个文件实在就是字符串的拼接,没什么技术含量,不过天生的花样还得注重一下。

兼容一切状况的.d.ts写法

平常我们运用一个库文件的时刻,都邑有三种用法:

import Util from 'xxx/Util'
import {DateTime, Fiel} from 'xxx/Util'
import * as Util from 'xxx/Util'

在运用的时刻,这三种情势所须要的.d.ts文件的花样也是不一样的,所以作为对外供应效劳的库文件来讲,一切的运用体式格局,我们都应该兼容。经由屡次尝试,如许花样的.d.ts文件是兼容一切用法:

export class DateTime {
    static dateFormat(....)
}

declare const exDe: {
    DateTime: typeof DateTime
}

export default exDe

源码

Demo的源码以及运用结果,用力点我
Demo中用到的代码搜检东西,用力点我

运用结果

  • 搜检失利的状况

《运用 Typescript 搜检你的代码范例》

  • 搜检胜利的状况

《运用 Typescript 搜检你的代码范例》

    原文作者:会说话的鱼
    原文地址: https://segmentfault.com/a/1190000013173370
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞