parameter-properties
在類別建構式中需要或禁止參數屬性。
TypeScript 加入「參數屬性」的簡寫來同時在一個位置宣告類別建構式參數和類別屬性。對 TypeScript 新手來說,參數屬性可能會令人感到困惑,因為它不如其他宣告和初始化類別成員的方式來得明確。
這個規則可以設定為永遠禁止使用參數屬性,或是在可能的情況下強制使用。
module.exports = {
"rules": {
"@typescript-eslint/parameter-properties": "error"
}
};
在測試區嘗試這個規則 ↗
選項
此規則接受下列選項
type Modifier =
| 'private readonly'
| 'private'
| 'protected readonly'
| 'protected'
| 'public readonly'
| 'public'
| 'readonly';
type Options = [
{
allow?: Modifier[];
prefer?: 'class-property' | 'parameter-property';
},
];
const defaultOptions: Options = [{ allow: [], prefer: 'class-property' }];
此規則在預設狀態下,不需任何參數,並完全禁止使用參數屬性。它可以接受一個包含下列一或兩個或全部項目的選項物件
"allow"
:允許忽略某些類型的屬性"prefer"
:"class-property"
(預設) 或"parameter-property"
allow
如果您想忽略特定類型的屬性,那麼您可以傳遞一個物件,其中包含 "allow"
作為任何下列選項的陣列
allow
,一個陣列,其中包含一個或多個允許的修飾詞。有效的值是readonly
,允許**readonly**參數屬性。private
,允許**private**參數屬性。protected
,允許**protected**參數屬性。public
,允許**public**參數屬性。private readonly
,允許**private readonly**參數屬性。protected readonly
,允許**protected readonly**參數屬性。public readonly
,允許**public readonly**參數屬性。
例如,要忽略public
屬性
{
"@typescript-eslint/parameter-properties": [
true,
{
"allow": ["public"]
}
]
}
prefer
預設情況下,規則偏好類別屬性 ("class-property"
)。您可以改為使用 ("parameter-property"
) 來偏好參數屬性。
在 "parameter-property"
模式中,規則將在以下情況下發出報告
- 類別屬性和建構函式參數具有相同的名稱和類型
- 建構函式參數在建構函式開頭指派至類別屬性
default
此規則的程式碼範例完全沒有任何選項
- ❌ 不正確
- ✅ 正確
class Foo {
constructor(readonly name: string) {}
}
class Foo {
constructor(private name: string) {}
}
class Foo {
constructor(protected name: string) {}
}
class Foo {
constructor(public name: string) {}
}
class Foo {
constructor(private readonly name: string) {}
}
class Foo {
constructor(protected readonly name: string) {}
}
class Foo {
constructor(public readonly name: string) {}
}
在遊樂場中開啟class Foo {
constructor(name: string) {}
}
在遊樂場中開啟readonly
{ "allow": ["readonly"] }
選項的程式碼範例
- ❌ 不正確
- ✅ 正確
class Foo {
constructor(private name: string) {}
}
class Foo {
constructor(protected name: string) {}
}
class Foo {
constructor(public name: string) {}
}
class Foo {
constructor(private readonly name: string) {}
}
class Foo {
constructor(protected readonly name: string) {}
}
class Foo {
constructor(public readonly name: string) {}
}
在遊樂場中開啟class Foo {
constructor(name: string) {}
}
class Foo {
constructor(readonly name: string) {}
}
在遊樂場中開啟private
{ "allow": ["private"] }
選項的程式碼範例
- ❌ 不正確
- ✅ 正確
class Foo {
constructor(readonly name: string) {}
}
class Foo {
constructor(protected name: string) {}
}
class Foo {
constructor(public name: string) {}
}
class Foo {
constructor(private readonly name: string) {}
}
class Foo {
constructor(protected readonly name: string) {}
}
class Foo {
constructor(public readonly name: string) {}
}
在遊樂場中開啟class Foo {
constructor(name: string) {}
}
class Foo {
constructor(private name: string) {}
}
在遊樂場中開啟protected
{ "allow": ["protected"] }
選項的程式碼範例
- ❌ 不正確
- ✅ 正確
class Foo {
constructor(readonly name: string) {}
}
class Foo {
constructor(private name: string) {}
}
class Foo {
constructor(public name: string) {}
}
class Foo {
constructor(private readonly name: string) {}
}
class Foo {
constructor(protected readonly name: string) {}
}
class Foo {
constructor(public readonly name: string) {}
}
在遊樂場中開啟class Foo {
constructor(name: string) {}
}
class Foo {
constructor(protected name: string) {}
}
在遊樂場中開啟public
{ "allow": ["public"] }
選項的程式碼範例
- ❌ 不正確
- ✅ 正確
class Foo {
constructor(readonly name: string) {}
}
class Foo {
constructor(private name: string) {}
}
class Foo {
constructor(protected name: string) {}
}
class Foo {
constructor(private readonly name: string) {}
}
class Foo {
constructor(protected readonly name: string) {}
}
class Foo {
constructor(public readonly name: string) {}
}
在遊樂場中開啟class Foo {
constructor(name: string) {}
}
class Foo {
constructor(public name: string) {}
}
在遊樂場中開啟private readonly
{ "allow": ["private readonly"] }
選項的程式碼範例
- ❌ 不正確
- ✅ 正確
class Foo {
constructor(readonly name: string) {}
}
class Foo {
constructor(private name: string) {}
}
class Foo {
constructor(protected name: string) {}
}
class Foo {
constructor(public name: string) {}
}
class Foo {
constructor(protected readonly name: string) {}
}
class Foo {
constructor(public readonly name: string) {}
}
在遊樂場中開啟class Foo {
constructor(name: string) {}
}
class Foo {
constructor(private readonly name: string) {}
}
在遊樂場中開啟protected readonly
{ "allow": ["protected readonly"] }
選項的程式碼範例
- ❌ 不正確
- ✅ 正確
class Foo {
constructor(readonly name: string) {}
}
class Foo {
constructor(private name: string) {}
}
class Foo {
constructor(protected name: string) {}
}
class Foo {
constructor(public name: string) {}
}
class Foo {
constructor(private readonly name: string) {}
}
class Foo {
constructor(public readonly name: string) {}
}
在遊樂場中開啟class Foo {
constructor(name: string) {}
}
class Foo {
constructor(protected readonly name: string) {}
}
在遊樂場中開啟public readonly
{ "allow": ["public readonly"] }
選項的程式碼範例
- ❌ 不正確
- ✅ 正確
class Foo {
constructor(readonly name: string) {}
}
class Foo {
constructor(private name: string) {}
}
class Foo {
constructor(protected name: string) {}
}
class Foo {
constructor(public name: string) {}
}
class Foo {
constructor(private readonly name: string) {}
}
class Foo {
constructor(protected readonly name: string) {}
}
在遊樂場中開啟class Foo {
constructor(name: string) {}
}
class Foo {
constructor(public readonly name: string) {}
}
在遊樂場中開啟"parameter-property"
{ "prefer": "parameter-property" }
選項的程式碼範例
- ❌ 不正確
- ✅ 正確
class Foo {
private name: string;
constructor(name: string) {
this.name = name;
}
}
class Foo {
public readonly name: string;
constructor(name: string) {
this.name = name;
}
}
class Foo {
constructor(name: string) {
this.name = name;
}
name: string;
}
在遊樂場中開啟class Foo {
private differentName: string;
constructor(name: string) {
this.differentName = name;
}
}
class Foo {
private differentType: number | undefined;
constructor(differentType: number) {
this.differentType = differentType;
}
}
class Foo {
protected logicInConstructor: string;
constructor(logicInConstructor: string) {
console.log('Hello, world!');
this.logicInConstructor = logicInConstructor;
}
}
在遊樂場中開啟何時不使用
若您不在乎班級中建構函式的哪些參數屬性樣式被採用時,則不需要這條規則。
但是請記住,不一致的樣式會損害專案的可讀性。建議您選擇這條規則中,最適合您專案的單一選項。