From 62b2b1f1f9208615b8c25c1555abd8f3f37040e0 Mon Sep 17 00:00:00 2001 From: Pete Gonzalez <4673363+octogonz@users.noreply.github.com> Date: Wed, 31 Jul 2019 23:32:54 -0700 Subject: [PATCH] feat(eslint-plugin): Improve "interface-name-prefix" to accept a private name such as "_IAnimal" --- .../docs/rules/interface-name-prefix.md | 37 ++++++++++++++++--- .../src/rules/interface-name-prefix.ts | 2 +- .../tests/rules/interface-name-prefix.test.ts | 8 ++++ 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/packages/eslint-plugin/docs/rules/interface-name-prefix.md b/packages/eslint-plugin/docs/rules/interface-name-prefix.md index c6d907568a1..1ef652dffd7 100644 --- a/packages/eslint-plugin/docs/rules/interface-name-prefix.md +++ b/packages/eslint-plugin/docs/rules/interface-name-prefix.md @@ -1,18 +1,21 @@ # Require that interface names be prefixed with `I` (interface-name-prefix) -It can be hard to differentiate between classes and interfaces. -Prefixing interfaces with "I" can help telling them apart at a glance. +Interfaces often represent important software contracts, so it can be helpful to prefix their names with `I`. +The unprefixed name is then available for a class that provides a standard implementation of the interface. ## Rule Details -This rule enforces consistency of interface naming prefix conventions. +This rule enforces whether or not the `I` prefix is required for interface names. ## Options This rule has a string option. -- `"never"` (default) disallows all interfaces being prefixed with `"I"` -- `"always"` requires all interfaces be prefixed with `"I"` +- `"never"` (default) disallows all interfaces being prefixed with `"I"` (or `"_I"`) +- `"always"` requires all interfaces be prefixed with `"I"` (or `"_I"`) + +The `_` prefix is sometimes used to designate a private declaration, in which case a private interface might be +named `_IAnimal` instead of `IAnimal`. The rule recognizes both forms. ### never @@ -24,6 +27,14 @@ The following patterns are considered warnings: interface IAnimal { name: string; } + +interface _IAnimal { + name: string; +} + +interface IIguana { + name: string; +} ``` The following patterns are not warnings: @@ -32,6 +43,10 @@ The following patterns are not warnings: interface Animal { name: string; } + +interface Iguana { + name: string; +} ``` ### always @@ -42,6 +57,10 @@ The following patterns are considered warnings: interface Animal { name: string; } + +interface Iguana { + name: string; +} ``` The following patterns are not warnings: @@ -50,6 +69,14 @@ The following patterns are not warnings: interface IAnimal { name: string; } + +interface _IAnimal { + name: string; +} + +interface IIguana { + name: string; +} ``` ## When Not To Use It diff --git a/packages/eslint-plugin/src/rules/interface-name-prefix.ts b/packages/eslint-plugin/src/rules/interface-name-prefix.ts index 1af78f79a53..f90e1557b6d 100644 --- a/packages/eslint-plugin/src/rules/interface-name-prefix.ts +++ b/packages/eslint-plugin/src/rules/interface-name-prefix.ts @@ -35,7 +35,7 @@ export default util.createRule({ return false; } - return /^I[A-Z]/.test(name); + return /^_?I[A-Z]/.test(name); } return { diff --git a/packages/eslint-plugin/tests/rules/interface-name-prefix.test.ts b/packages/eslint-plugin/tests/rules/interface-name-prefix.test.ts index 09cf548c7ac..dd166e75833 100644 --- a/packages/eslint-plugin/tests/rules/interface-name-prefix.test.ts +++ b/packages/eslint-plugin/tests/rules/interface-name-prefix.test.ts @@ -22,6 +22,14 @@ interface IAnimal { }, { code: ` +interface _IAnimal { + name: string; +} + `, + options: ['always'], + }, + { + code: ` interface IIguana { name: string; }