explicit-member-accessibility
要求明確規定類別屬性和方法的存取修飾子。
本規則報告的某些問題,可透過 ESLint 命令列選項 --fix
自動修復.
本規則報告的某些問題,可透過編輯器 建議手動修復.
TypeScript 允許在類別成員前面加上明確的 public
、protected
和 private
存取修飾子。這些修飾子僅存在於類型系統中,且其用途僅在於說明誰有權存取這些成員。
省略存取修飾子,可減少要閱讀和編寫的程式碼。成員預設為 public
。
不過,明確新增存取修飾子,有助於在具有多個類別的程式碼庫中,強制執行成員的適當私密性。有些開發人員也發現,將成員公開程度明確表達出來,會比較有利於程式碼可讀性。
module.exports = {
"rules": {
"@typescript-eslint/explicit-member-accessibility": "error"
}
};
在執行環境中試試這項規則 ↗
範例
此規則旨於讓程式碼更為可讀,明確哪些人員可以使用哪些屬性。
選項
此規則接受下列選項
type AccessibilityLevel =
/** Always require an accessor. */
| 'explicit'
/** Never check whether there is an accessor. */
| 'off'
/** Require an accessor except when public. */
| 'no-public';
type Options = [
{
accessibility?: AccessibilityLevel;
ignoredMethodNames?: string[];
overrides?: {
accessors?: AccessibilityLevel;
constructors?: AccessibilityLevel;
methods?: AccessibilityLevel;
parameterProperties?: AccessibilityLevel;
properties?: AccessibilityLevel;
};
},
];
const defaultOptions: Options = [{ accessibility: 'explicit' }];
於混合式 JS/TS 程式碼庫中設定
如果你使用的程式碼庫中包含你會加以整理的非 TypeScript 程式碼(例如 .js
/.mjs
/.cjs
/.jsx
),則你應確保使用 ESLint overrides
,以在 .ts
/.mts
/.cts
/.tsx
檔案中啟用規則。否則,你會收到無法修復的整理錯誤報告(出現在 .js
/.mjs
/.cjs
/.jsx
檔案中)。
{
"rules": {
// disable the rule for all files
"@typescript-eslint/explicit-member-accessibility": "off",
},
"overrides": [
{
// enable the rule specifically for TypeScript files
"files": ["*.ts", "*.mts", "*.cts", "*.tsx"],
"rules": {
"@typescript-eslint/explicit-member-accessibility": "error",
},
},
],
}
accessibility
此規則的預設狀態不需要設定,會強制要求每個類別成員都有存取修飾詞。如果你想要允許一些隱含的公開成員,則你會有下列選項
{
"accessibility": "explicit",
"overrides": {
"accessors": "explicit",
"constructors": "no-public",
"methods": "explicit",
"properties": "off",
"parameterProperties": "explicit",
},
}
請注意以上範例是你可以使用的設定範例,這並非預設設定。
如果不提供任何選項,下列รูปแบบ會被視為是不正確的程式碼
class Animal {
constructor(name) {
// No accessibility modifier
this.animalName = name;
}
animalName: string; // No accessibility modifier
get name(): string {
// No accessibility modifier
return this.animalName;
}
set name(value: string) {
// No accessibility modifier
this.animalName = value;
}
walk() {
// method
}
}
於執行環境中開啟下列รูปแบบ被視為是正確的,預設選項為 { accessibility: 'explicit' }
class Animal {
public constructor(
public breed,
name,
) {
// Parameter property and constructor
this.animalName = name;
}
private animalName: string; // Property
get name(): string {
// get accessor
return this.animalName;
}
set name(value: string) {
// set accessor
this.animalName = value;
}
public walk() {
// method
}
}
於執行環境中開啟下列รูปแบบ被視為是不正確的,其存取設定為 no-public [{ accessibility: 'no-public' }]
class Animal {
public constructor(
public breed,
name,
) {
// Parameter property and constructor
this.animalName = name;
}
public animalName: string; // Property
public get name(): string {
// get accessor
return this.animalName;
}
public set name(value: string) {
// set accessor
this.animalName = value;
}
public walk() {
// method
}
}
於執行環境中開啟下列รูปแบบ被視為是正確的,其存取設定為 no-public [{ accessibility: 'no-public' }]
class Animal {
constructor(
protected breed,
name,
) {
// Parameter property and constructor
this.name = name;
}
private animalName: string; // Property
get name(): string {
// get accessor
return this.animalName;
}
private set name(value: string) {
// set accessor
this.animalName = value;
}
protected walk() {
// method
}
}
於執行環境中開啟overrides
有下列三種方法可以使用 override。
- 禁止在特定成員上使用 public。
- 當根目錄允許隱形公開存取時,強制執行明確的成員存取限制。
- 針對特定成員類型停用檢查
禁止在特定成員上使用 public
例如,[ { overrides: { constructors: 'no-public' } } ]
下列模式被視為是不正確的,參考 override 範例
class Animal {
public constructor(protected animalName) {}
public get name() {
return this.animalName;
}
}
於執行環境中開啟使用範例中列舉之設定,以下模式會被認定為正確
class Animal {
constructor(protected animalName) {}
public get name() {
return this.animalName;
}
}
於執行環境中開啟要求指定成員的可見性
例如,[ { accessibility: 'no-public', overrides: { properties: 'explicit' } } ]
下列模式被視為是不正確的,參考 override 範例
class Animal {
constructor(protected animalName) {}
get name() {
return this.animalName;
}
protected set name(value: string) {
this.animalName = value;
}
legs: number;
private hasFleas: boolean;
}
於執行環境中開啟使用範例中列舉之設定,以下模式會被認定為正確
class Animal {
constructor(protected animalName) {}
get name() {
return this.animalName;
}
protected set name(value: string) {
this.animalName = value;
}
public legs: number;
private hasFleas: boolean;
}
於執行環境中開啟例如,[ { accessibility: 'off', overrides: { parameterProperties: 'explicit' } } ]
使用範例中列舉之設定,以下程式碼會被認定為不正確
class Animal {
constructor(readonly animalName: string) {}
}
於執行環境中開啟使用範例中列舉之設定,以下程式碼模式會被認定為正確
class Animal {
constructor(public readonly animalName: string) {}
}
class Animal {
constructor(public animalName: string) {}
}
class Animal {
constructor(animalName: string) {}
}
於執行環境中開啟例如,[ { accessibility: 'off', overrides: { parameterProperties: 'no-public' } } ]
使用範例中列舉之設定,以下程式碼會被認定為不正確
class Animal {
constructor(public readonly animalName: string) {}
}
於執行環境中開啟使用範例中列舉之設定,以下程式碼會被認定為正確
class Animal {
constructor(public animalName: string) {}
}
於執行環境中開啟停用指定成員類型上的所有檢查
例如,[{ overrides: { accessors : 'off' } } ]
由於未執行覆寫成員類型上的任何檢查,因此允許該成員類型使用任何可見性排列組合
使用指定的組態時,以下模式會被認定為不正確
class Animal {
constructor(protected animalName) {}
public get name() {
return this.animalName;
}
get legs() {
return this.legCount;
}
}
於執行環境中開啟使用範例中列舉之設定,以下模式會被認定為正確
class Animal {
public constructor(protected animalName) {}
public get name() {
return this.animalName;
}
get legs() {
return this.legCount;
}
}
於執行環境中開啟ignoredMethodNames
如果您想要忽略特定方法,您可以透過指定方法名稱來執行這個動作。請注意,這個選項不注重於內容,且會忽略包含這些名稱的每個方法,這可能會導致它錯失一些案例。您應該謹慎使用它。例如,[ { ignoredMethodNames: ['specificMethod', 'whateverMethod'] } ]
class Animal {
get specificMethod() {
console.log('No error because you specified this method on option');
}
get whateverMethod() {
console.log('No error because you specified this method on option');
}
public get otherMethod() {
console.log('This method comply with this rule');
}
}
於執行環境中開啟不應使用它的狀況
如果您認為預設為公開是一個不錯的預設,那麼您應該考慮改用no-public
設定。如果您想要混合公開的內隱和外顯成員,那麼您就可以停用此規則。
然而,請記住不一致的風格會損害專案的可讀性。我們建議您為此規則選擇最適合您專案的單一選項。
延伸讀物
- TypeScript Accessibility Modifiers Handbook Docs