--- description: 'Disallow unnecessary constraints on generic types.' --- > 🛑 This file is source code, not the primary documentation location! 🛑 > > See **https://typescript-eslint.io/rules/no-unnecessary-type-constraint** for documentation. ## Rule Details Type parameters (``) may be "constrained" with an `extends` keyword ([docs](https://www.typescriptlang.org/docs/handbook/generics.html#generic-constraints)). When not provided, type parameters happen to default to: - As of TypeScript 3.9: `unknown` ([docs](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-9.html#type-parameters-that-extend-any-no-longer-act-as-any)) - Before that, as of 3.5: `any` ([docs](https://devblogs.microsoft.com/typescript/announcing-typescript-3-5/#breaking-changes)) It is therefore redundant to `extend` from these types in later versions of TypeScript. Examples of code for this rule: ### ❌ Incorrect ```ts interface FooAny {} interface FooUnknown {} type BarAny = {}; type BarUnknown = {}; class BazAny { quxUnknown() {} } class BazUnknown { quxUnknown() {} } const QuuxAny = () => {}; const QuuxUnknown = () => {}; function QuuzAny() {} function QuuzUnknown() {} ``` ### ✅ Correct ```ts interface Foo {} type Bar = {}; class Baz { qux { } } const Quux = () => {}; function Quuz() {} ``` ## Options ```jsonc // .eslintrc.json { "rules": { "@typescript-eslint/no-unnecessary-type-constraint": "error" } } ``` This rule is not configurable. ## When Not To Use It 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.