Type parameters (<T>
) may be "constrained" with an extends
keyword (docs).
When not provided, type parameters happen to default to:
It is therefore redundant to extend
from these types in later versions of TypeScript.
Examples of incorrect code for this rule:
interface FooAny<T extends any> {}
interface FooUnknown<T extends unknown> {}
type BarAny<T extends any> = {};
type BarUnknown<T extends unknown> = {};
class BazAny<T extends any> {
quxUnknown<U extends unknown>() {}
}
class BazUnknown<T extends unknown> {
quxUnknown<U extends unknown>() {}
}
const QuuxAny = <T extends any>() => {};
const QuuxUnknown = <T extends unknown>() => {};
function QuuzAny<T extends any>() {}
function QuuzUnknown<T extends unknown>() {}
Examples of correct code for this rule:
interface Foo<T> {}
type Bar<T> = {};
class Baz<T> {
qux<U> { }
}
const Quux = <T>() => {};
function Quuz<T>() {}
If you don't care about the specific styles of your type constraints, or never use them in the first place, then you will not need this rule.