TSLint配置規(guī)則(部分)
參照 https://palantir.github.io/tslint/rules/
檢索key為配置項(xiàng)的key。
以下配置均配置在tslint.json中静秆。
部分配置項(xiàng)目可能不全,具體參考官網(wǎng)。
TypeScript-specific(ts特有)
- 配置禁用
@ts-ignore
注釋?zhuān)渲檬纠?/strong>
"ban-ts-ignore": true
在這種情況下壳鹤,以下無(wú)效的代碼會(huì)報(bào)警告而無(wú)法忽略:
if (false) {
// @ts-ignore: Unreachable code error
console.log("hello");
}
- 配置訪(fǎng)問(wèn)權(quán)限堵漱,配置示例:
"member-access": true "member-access": [true, "no-public"] "member-access": [true, "check-accessor"]
設(shè)置為no-public
或者true
禁止指定參數(shù)的訪(fǎng)問(wèn)權(quán)限為public;
設(shè)置為check-accessor
強(qiáng)制性轉(zhuǎn)換get和set的方法為public權(quán)限; 更多配置參見(jiàn)官網(wǎng)祷愉。
- 配置屬性以及方法的code順序,配置示例:
“member-ordering": fields-first “member-ordering": instance-sandwich “member-ordering": statics-first
一般選用fields-first
,這種情況下的排序規(guī)則是:
* 屬性在構(gòu)造方法之前,構(gòu)造方法在方法之前
* 靜態(tài)成員在實(shí)例成員之前
* public成員在protect成員之前湖雹,protect成員在private成員之前
其他兩種排序參考官網(wǎng)咏闪。
- 配置禁用
any
類(lèi)型修飾符,配置示例:
"no-any": true "no-any": [true,{"ignore-rest-args": true}]
一般使用第二個(gè)配置,這種情況下摔吏,作為多參數(shù)傳入的數(shù)組參數(shù)將不會(huì)被限制使用any鸽嫂。
例如以下的寫(xiě)法將會(huì)通過(guò)檢查:
function foo(a: number, ...rest: any[]): void {
return;
}
- 配置禁用空接口,配置示例:
"no-empty-interface": true
- 配置禁用
for ... in
語(yǔ)句
"no-for-in": true
for…in
語(yǔ)句是舊式JavaScript語(yǔ)法征讲,通常需要在其循環(huán)體內(nèi)進(jìn)行詳細(xì)的hasOwnProperty檢查据某。 這些語(yǔ)句可以完全用現(xiàn)代JS&TS中的for…of
語(yǔ)句代替。
- 配置防止
import
語(yǔ)句引入具有副作用的依賴(lài)诗箍,配置示例:
"no-import-side-effect": true "no-import-side-effect": [true, {"ignore-module": "(\\.html|\\.css)$"}]
一般使用第一種即可癣籽。
- 配置禁止顯示聲明string、boolean滤祖、number型的變量筷狼,配置示例:
"no-inferrable-types": true "no-inferrable-types": [true, "ignore-params"] "no-inferrable-types": [true, "ignore-params", "ignore-properties"]
由于編譯器可以很容易地推斷出這三種類(lèi)型,所以禁止這三種類(lèi)型的聲明匠童,減少代碼冗余埂材。
"ignore-params", "ignore-properties"
表示忽略函數(shù)以及類(lèi)屬性的檢查。
- 配置禁止內(nèi)部模塊俏让,配置示例:
"no-internal-module": true
使用模塊的概念可能會(huì)與外部模塊混淆楞遏,建議使用命名空間的概念(后續(xù)有類(lèi)似的配置)。
- 配置禁止使用Magic Number,配置示例:
"no-magic-numbers": [true, 1, 2, 3] "no-magic-numbers": [true, {"allowed-numbers": [1, 2, 3], "ignore-jsx": true}]
不允許在變量分配之外使用常量值首昔,默認(rèn)的情況下寡喝,-1,0和1將會(huì)是允許值。
強(qiáng)制常量值存儲(chǔ)在變量中將會(huì)提供更高的可讀性勒奇。
- 配置禁用內(nèi)部模塊以及命名空間预鬓,配置示例:
"no-namespace": true
原因及理由同"no-internal-module"
配置。此外赊颠,這項(xiàng)規(guī)則并不會(huì)禁止 declare module ... {}
格二。剩余配置參照官網(wǎng)劈彪。
- 配置禁用"!"后綴,配置示例:
"no-non-null-assertion": true
在嚴(yán)格模式下顶猜,coder應(yīng)該提前做好non-null check沧奴。(未定義的參數(shù)加上?也可防止空指針-> undefind?.do())
舉例,一般情況下(未配置這項(xiàng)規(guī)則):
function foo(instance: MyClass | undefined) {
instance!.doWork();
}
假設(shè)instance存在长窄,這種情況下不會(huì)報(bào)錯(cuò)滔吠。編碼時(shí)應(yīng)該如下做好non-null check:
function foo(instance: MyClass | undefined) {
if (instance !== undefined) {
instance.doWork();
}
}
- 配置禁止重新分配參數(shù),配置示例:
"no-parameter-reassignment": true
- 配置禁用
require
語(yǔ)句挠日,配置示例:
"no-var-requires": true
禁用類(lèi)似var module = require("module")
的語(yǔ)句疮绷,只能在import語(yǔ)句中使用require
import foo = require('foo')
- 配置禁用傳統(tǒng)的無(wú)箭頭函數(shù),配置示例:
"only-arrow-functions": true "only-arrow-functions": [true, "allow-declarations", "allow-named-functions"]
一般采用第二項(xiàng)配置嚣潜。允許獨(dú)立的函數(shù)定義不使用箭頭函數(shù)冬骚。但是不允許function(){}
形式
注意:如果函數(shù)體中有this
指向,那么本項(xiàng)配置將會(huì)被忽略懂算。因?yàn)閭鹘y(tǒng)函數(shù)不會(huì)綁定this的作用域只冻,在函數(shù)中有this的情況下,會(huì)導(dǎo)致作用域不一致犯犁。
- 配置使用for...of代替?zhèn)鹘y(tǒng)的for循環(huán)属愤,配置示例:
"prefer-for-of": true
如果循環(huán)的index沒(méi)有特殊用途,那么建議使用for..of酸役。
- 配置函數(shù)以及屬性需要定義返回類(lèi)型及類(lèi)型住诸,配置示例:
"typedef": [true, "call-signature", "parameter", "member-variable-declaration"]
更多配置項(xiàng)參見(jiàn)官網(wǎng),一般上述配置即夠用涣澡。
- 配置參數(shù)重載警告贱呐,配置示例:
"unified-signatures": true
Functionality(功能性)
- 配置檢查異步函數(shù),配置示例:
"promise-function-async": true "promise-function-async": [true, "check-function-declaration", "check-method-declaration"]
檢查函數(shù)類(lèi)型入桂,一般使用第一個(gè)默認(rèn)配置即可奄薇。
- 配置異步調(diào)用檢查,配置示例:
"await-promise": true "await-promise": [true, "Thenable"]
一般配置第一項(xiàng)即可抗愁。
- 配置禁用逗號(hào)運(yùn)算符馁蒂,配置示例:
"ban-comma-operator": true
舉例:
let x = (y = 1, z = 2); // x is equal to 2 - this may not be immediately obvious.
上式x=2
,這種寫(xiě)法語(yǔ)義不明確蜘腌。
- 配置禁止省略花括號(hào)沫屡,配置示例:
"curly": true
if/for/do/while
語(yǔ)句的花括號(hào)不可省略。
- 配置使用
if
條件過(guò)濾for...in
語(yǔ)句撮珠,配置示例:
"forin": true
防止在循環(huán)中迭代到原型中擁有的屬性沮脖。
舉例(someObject的prototype中也會(huì)擁有可觀(guān)的屬性數(shù)量):
for (let key in someObject) {
if (someObject.hasOwnProperty(key)) {
// code here
}
}
- 配置禁用內(nèi)置的Function構(gòu)造函數(shù),配置示例:
"function-constructor": true
直接使用Function構(gòu)造函數(shù)會(huì)導(dǎo)致設(shè)計(jì)上的問(wèn)題,同時(shí)會(huì)導(dǎo)致性能低下,如果需要?jiǎng)討B(tài)創(chuàng)建function,應(yīng)該使用工廠(chǎng)函數(shù)來(lái)返回function勺届。
以下寫(xiě)法將會(huì)警告:
let doesNothing = new Function();
應(yīng)該改為:
let doesNothing = () => {};
- 配置只允許在合適的位置使用流程控制標(biāo)簽,配置示例:
"label-position": true
本項(xiàng)規(guī)則只會(huì)允許在流程控制中的標(biāo)簽驶俊。
頻繁使用流程控制標(biāo)簽會(huì)使代碼結(jié)構(gòu)性變差。
- 配置禁用
arguments.callee
的寫(xiě)法免姿,配置示例:
"no-arg": true
具體原因參照https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments/callee
- 配置有異步標(biāo)簽的函數(shù)需要在返回值前加上
await
,配置示例:
"no-async-without-await": true
舉例,以下是正確的寫(xiě)法:
async function f() {
await fetch();
}
const f = async () => {
await fetch();
};
const f = async () => {
return 'value';
};
- 配置禁用位運(yùn)算符,配置示例:
"no-bitwise": true
禁用下列運(yùn)算符 &
, &=
, |
, |=
, ^
, ^=
, <<
, <<=
, >>
, >>=
, >>>
, >>>=
, ~
.
不會(huì)禁用&
,|
.
- 配置禁止在流程控制中使用類(lèi)型分配,配置示例:
"no-conditional-assignment": true
舉例饼酿,不允許以下寫(xiě)法:
if (var1 = var2)
只能在流程控制中使用正常的類(lèi)型判斷:
if (var1 = var2)
- 配置禁用指定的console函數(shù),配置示例:
"no-console": [true, "log", "error"]
生產(chǎn)環(huán)境中,console函數(shù)并不適用养泡。
- 配置禁用String,Number,Boolean的構(gòu)造函數(shù),配置示例:
"no-construct": true
禁用類(lèi)似 new Number(foo)
的寫(xiě)法嗜湃,但是不禁用Number(foo)
的寫(xiě)法。
- 配置禁用
debugger
語(yǔ)句,配置示例:
"no-debugger": true
debugger
語(yǔ)句不適用于生產(chǎn)環(huán)境澜掩。
- 配置禁止在函數(shù)中出現(xiàn)兩次
super()
,配置示例:
"no-duplicate-super": true
第二次出現(xiàn)的super()
會(huì)在運(yùn)行時(shí)失敗。
- 配置禁止多重
switch
,配置示例:
"no-duplicate-switch-case": true
- 配置禁止在同一代碼塊中兩次聲明同一個(gè)變量,配置示例:
"no-duplicate-variable": true "no-duplicate-variable": [true, "check-parameters"]
一般使用第一項(xiàng)即可杖挣。
本項(xiàng)規(guī)則只會(huì)對(duì)var
聲明起作用肩榕。
- 配置禁用
delete
操作符,配置示例:
"no-dynamic-delete": true
盡量使用Map
或者Set
,來(lái)存儲(chǔ)惩妇,Object
使用delete
會(huì)偶爾引起不可預(yù)知的錯(cuò)誤(性能低下)株汉。
- 配置禁止空代碼塊,配置示例:
"no-empty": true "no-empty": [true, "allow-empty-catch"] "no-empty": [true, "allow-empty-functions"] "no-empty": [true, "allow-empty-catch", "allow-empty-functions"]
一般使用第一項(xiàng)配置即可,代碼塊中有注釋時(shí)并不會(huì)被認(rèn)為是空代碼塊歌殃。
- 配置禁用
eval
函數(shù),配置示例:
"no-eval": true
- 配置禁止出現(xiàn)未處理的
Promise
,配置示例:
"no-floating-promises": true "no-floating-promises": [true, "JQueryPromise"]
一般使用第一項(xiàng)即可乔妈,第二項(xiàng)的參數(shù)指定了額外的處理項(xiàng)目。
- 配置禁止使用
for...in
來(lái)迭代一個(gè)數(shù)組,配置示例:
"no-for-in-array": true
如果要遍歷索引,以下代碼可以參照:
array.forEach((value, index) => { … });
for (const [index, value] of array.entries()) { … }
for (let i = 0; i < array.length; i++) { … }
- 配置禁止引用
package.json
范圍外的包,配置示例:
"no-implicit-dependencies": true
- 配置禁止空花括號(hào)對(duì)象({ }),配置示例:
"no-inferred-empty-object-type": true
因?yàn)榫幾g器無(wú)法推斷其類(lèi)型氓皱。
- 配置禁止在非模板中使用${}語(yǔ)句,配置示例:
"no-invalid-template-strings": true
- 配置禁止在類(lèi)范圍外使用
this
,配置示例:
"no-invalid-this": true
- 配置禁止為類(lèi)或者接口重新定義構(gòu)造函數(shù),配置示例:
"no-misused-new": true
如果想要聲明一個(gè)稱(chēng)為類(lèi)的函數(shù)路召,那么最好使用declare class
。
- 配置禁止使用
null
語(yǔ)法,配置示例:
"no-null-keyword": true
在JavaScript中,undefined
一般指不存在并且沒(méi)有任何指向的值,而null
則指這個(gè)值確實(shí)存在但是還沒(méi)有指向任何值波材。
- 配置禁止聲明為
null
和undefined
的聯(lián)合類(lèi)型的成員或者返回值,配置示例:
"no-null-undefined-union": true
- 配置禁止在定義對(duì)象時(shí)使用as類(lèi)型斷言符號(hào),配置示例:
"no-object-literal-type-assertion": true
以下寫(xiě)法會(huì)通過(guò)檢查:
let foo = {} as any;
let foo = {} as unknown;
let foo = {} as any as Foo;
let foo = {} as unknown as Foo;
const x: T = { ... };
以下寫(xiě)法將不會(huì)通過(guò)檢查:
let foo = {} as Foo;
let foo = <Foo>{};
- 配置警告在
if
條件中使用Promise函數(shù)作為條件,配置示例:
"no-promise-as-boolean": true
舉例股淡,以下寫(xiě)法將會(huì)通過(guò)檢查:
async function waiter(custumerDecisionPromise: Promise<any>) {
if (await custumerDecisionPromise) {
console.log("Customer ready to take an order.")
}
}
以下寫(xiě)法將會(huì)警告:
async function waiter(custumerDecisionPromise: Promise<any>) {
if (custumerDecisionPromise) {
console.log("Customer ready to take an order.")
}
}
- 配置禁止指定的全局變量名,配置示例:
"no-restricted-globals": [true, "name", "length", "event"]
可以根據(jù)需要添加,以上是三個(gè)字符串默認(rèn)的列表廷区。
- 配置禁止不必要的
return await
,配置示例:
"no-return-await": true
異步函數(shù)總是在Promise中包含了返回值唯灵,使用await
只會(huì)增加等待時(shí)間而不會(huì)改變語(yǔ)義。
- 配置禁止陰影變量的聲明,配置示例:
"no-shadowed-variable": true
當(dāng)一個(gè)本地變量和局部變量重名時(shí)隙轻,就會(huì)產(chǎn)生陰影變量(shadow),這將會(huì)混淆語(yǔ)義埠帕。
- 配置禁止數(shù)組缺少元素,配置示例:
"no-sparse-arrays": true
缺少元素會(huì)導(dǎo)致重復(fù)的逗號(hào),這是不必要的玖绿。
以下寫(xiě)法將會(huì)通過(guò)檢查:
const arr: string[] = ['elemenet1', 'element2'];
以下寫(xiě)法將會(huì)警告:
const arr: string[] = ['elemenet1',, 'element2'];
- 配置禁止不必要的
['propertyName']
來(lái)訪(fǎng)問(wèn)對(duì)象屬性,配置示例:
"no-string-literal": true
允許 obj["prop-erty"]
方式( can’t be a regular property access )敛瓷,不允許 obj["property"]
(應(yīng)該用 obj.property
).。
- 配置不允許拋出一個(gè)字符串,配置示例:
"no-string-throw": true
字符串或者基本類(lèi)型并不是一個(gè)可拋出的錯(cuò)誤對(duì)象類(lèi)型镰矿。
舉例琐驴,以下寫(xiě)法將通過(guò)檢查:
try {
// ...
} catch (e) {
throw e;
}
以下寫(xiě)法將會(huì)警告:
try {
// ...
} catch {
throw 'There was a problem.';
}
- 配置禁止引入子模塊,配置示例:
"no-submodule-imports": true
- 配置禁止不顯示聲明的
fall-through
,配置示例:
"no-switch-case-fall-through": true
在switch
分支中的 Fall though
一般是bug白热。
在JavaScript中,如果switch的case后不中斷遣总,那么代碼會(huì)繼續(xù)執(zhí)行锄贷,這叫做Fall Through
。
除非邏輯上需求牢酵,coder故意進(jìn)行Fall Through,那么其他情況下,編譯會(huì)報(bào)出警告悬包。
舉例,編碼時(shí)因需求確實(shí)不需要break
馍乙,如下情況邏輯上無(wú)措布近,但是沒(méi)有顯示指明,則會(huì)報(bào)出警告:
switch(foo) {
case 1:
someFunc(foo);
case 2:
someOtherFunc(foo);
}
正確做法如下(加上注釋指明):
switch(foo) {
case 1:
someFunc(foo);
/* falls through */
case 2:
case 3:
someOtherFunc(foo);
}
- 配置類(lèi)型相同的邏輯比較,配置示例:
"no-tautology-expression": true
在進(jìn)行比較時(shí),相同類(lèi)型的才進(jìn)行比較丝格。
例如:3 === 3, someVar === someVar, “1” > “1”
- 配置禁止this的再定義,配置示例:
"no-this-assignment": true
在ES6中撑瞧,可以使用 lambdas 表達(dá)式來(lái)解決this的指向問(wèn)題。
例如显蝌,ES6以前:
const self = this;
setTimeout(function () {
self.doWork();
});
ES6(在胖箭頭函數(shù)中已經(jīng)保留了this的作用域):
setTimeout(() => {
this.doWork();
});
- 配置當(dāng)一個(gè)方法在作用域之外被調(diào)用時(shí)報(bào)出警告,配置示例:
"no-unbound-method": true
當(dāng)類(lèi)被實(shí)例化成為一個(gè)實(shí)例的時(shí)候预伺,類(lèi)方法的作用域?qū)⒉辉陬?lèi)實(shí)例中,而在window/global
中曼尊,例如以下代碼的log()
函數(shù)將會(huì)調(diào)用window/global
作用域的函數(shù):
class MyClass {
public log(): void {
console.log(this);
}
}
const instance = new MyClass();
const log = instance.log;
log(); // 調(diào)用的是全局的log()函數(shù)
這種情況下應(yīng)該使用ES6的箭頭函數(shù)(會(huì)保留當(dāng)前調(diào)用者的作用域)或者指定作用域:
class MyClass {
public logArrowBound = (): void => {
console.log(bound);
};
public logManualBind(): void {
console.log(this);
}
}
const instance = new MyClass();
// 箭頭函數(shù)的作用域指向當(dāng)前調(diào)用它的地方酬诀,這里指向了instance
const logArrowBound = instance.logArrowBound;
// 綁定當(dāng)前作用域
const logManualBind = instance.logManualBind.bind(instance);
logArrowBound();
logManualBind();
- 配置禁用非必要的類(lèi),配置示例:
"no-unnecessary-class": true "no-unnecessary-class": ["allow-static-only", "allow-constructor-only"]
一般使用第二項(xiàng),保留類(lèi)似OO風(fēng)格語(yǔ)言的工具類(lèi)作用骆撇。
- 配置禁止不安全的
any
類(lèi)型,配置示例:
"no-unsafe-any": true
推薦使用泛型瞒御。
- 配置禁止不安全的
finally
塊,配置示例:
"no-unsafe-finally": true
禁止在finally塊中使用流程控制語(yǔ)句,例如return,continue,break,throws
神郊。
- 配置禁用無(wú)用代碼塊,配置示例:
"no-unused-expression": true
- 配置禁用無(wú)用的參數(shù),配置示例:
"no-unused-variable": true
- 配置禁止在聲明或者引入之前使用參數(shù),配置示例:
"no-use-before-declare": true
- 配置禁用
var
,配置示例:
"no-var-keyword": true
ES6中,使用const
和let
來(lái)代替var
肴裙。
- 配置建議使用條件表達(dá)式而不是每個(gè)if分支都去做類(lèi)似的工作,配置示例:
"prefer-conditional-expression": true "prefer-conditional-expression": [true, "check-else-if"]
一般使用第二項(xiàng)(嵌套的if語(yǔ)句也會(huì)被檢查)。
- 配置使用ES2018的展開(kāi)運(yùn)算符來(lái)進(jìn)行對(duì)象合并屿岂,而不是用(
Object.assign()
),配置示例:
"prefer-object-spread": true
舉例:
function sum(x, y, z) {
return x + y + z;
}
const numbers = [1, 2, 3];
console.log(sum(...numbers)); // 這里的...numbers指的就是上面定義的數(shù)組
// expected output: 6
let obj1 = [1,2,3];
let obj2 = [4,5];
let obj3 = [...obj1,...obj2]; // => obj3 = [1,2,3,4,5]
- 配置在使用
parseInt
時(shí)加上進(jìn)制參數(shù),配置示例:
"radix": true
舉例,以下寫(xiě)法將會(huì)通過(guò)檢查:
const x: string = '11';
const dec: number = parseInt(x, 10);
以下將會(huì)報(bào)警告:
const x: string = '11';
const dec: number = parseInt(x);
- 配置參數(shù)相加時(shí)践宴,參數(shù)類(lèi)型必須相同(
number
或者string
),配置示例:
"restrict-plus-operands": true
- 配置禁止在
static
函數(shù)中使用this
,配置示例:
"static-this": true
- 配置限制出現(xiàn)在布爾類(lèi)型表達(dá)式中的值,默認(rèn)情況下只允許boolean值,配置示例:
"strict-boolean-expressions": true "strict-boolean-expressions": [true, "allow-boolean-or-undefined"]
一般使用第二項(xiàng),這種情況下,null值將不會(huì)通過(guò)檢查爷怀,例如:!null
將不會(huì)通過(guò)檢查阻肩。
更多配置參照官網(wǎng)。
- 配置只允許在基類(lèi)類(lèi)型中進(jìn)行比較,配置示例:
"strict-comparisons": true
更多配置參照官網(wǎng)运授。
- 配置禁止隱式的
toString()
調(diào)用,配置示例:
"strict-string-expressions": true
'foo' + bar
將不會(huì)通過(guò)檢查烤惊。
- 配置當(dāng)表達(dá)式總為true或者false時(shí)候報(bào)出警告,配置示例:
"strict-type-predicates": true
- 配置switch表達(dá)式中必須有default項(xiàng),配置示例:
"switch-default": true
- 配置實(shí)用三等號(hào)替代雙等號(hào),配置示例:
"triple-equals": true
- 配置確保使用typeof時(shí)和正確的string字符串進(jìn)行比較,配置示例:
"typeof-compare": true
- 配置禁用不必要的(空的)構(gòu)造函數(shù),配置示例:
"unnecessary-constructor": true
- 配置如果顯示聲明的參數(shù)類(lèi)型是其默認(rèn)值,則顯示警告,配置示例:
"use-default-type-parameter": true
- 配置使用
isNaN()
函數(shù)來(lái)判斷NaN
值吁朦,配置示例:
"use-isnan": true