Skip to content

💅 nursery/noShadow incorrectly flags Typescript constructor overload parameters in constructor implementation, class methods #7125

@Bertie690

Description

@Bertie690

Environment information

CLI:
  Version:                      2.0.0
  Color support:                true

Platform:
  CPU Architecture:             x86_64
  OS:                           linux

Environment:
  BIOME_LOG_PATH:               unset
  BIOME_LOG_PREFIX_NAME:        unset
  BIOME_CONFIG_PATH:            unset
  BIOME_THREADS:                unset
  NO_COLOR:                     unset
  TERM:                         xterm-256color
  JS_RUNTIME_VERSION:           v22.16.0
  JS_RUNTIME_NAME:              node
  NODE_PACKAGE_MANAGER:         pnpm/10.12.3

Biome Configuration:
  Status:                       Loaded successfully
  Path:                         biome.jsonc
  Formatter enabled:            true
  Linter enabled:               true
  Assist enabled:               true
  VCS enabled:                  false

Linter:
  JavaScript enabled:           unset
  JSON enabled:                 unset
  CSS enabled:                  unset
  GraphQL enabled:              unset
  Recommended:                  true
  Enabled rules:
    a11y/noAccessKey
    a11y/noAriaHiddenOnFocusable
    a11y/noAriaUnsupportedElements
    a11y/noAutofocus
    a11y/noDistractingElements
    a11y/noHeaderScope
    a11y/noInteractiveElementToNoninteractiveRole
    a11y/noLabelWithoutControl
    a11y/noNoninteractiveElementToInteractiveRole
    a11y/noNoninteractiveTabindex
    a11y/noPositiveTabindex
    a11y/noRedundantAlt
    a11y/noRedundantRoles
    a11y/noStaticElementInteractions
    a11y/noSvgWithoutTitle
    a11y/useAltText
    a11y/useAnchorContent
    a11y/useAriaActivedescendantWithTabindex
    a11y/useAriaPropsForRole
    a11y/useAriaPropsSupportedByRole
    a11y/useButtonType
    a11y/useFocusableInteractive
    a11y/useGenericFontNames
    a11y/useHeadingContent
    a11y/useHtmlLang
    a11y/useIframeTitle
    a11y/useKeyWithClickEvents
    a11y/useKeyWithMouseEvents
    a11y/useMediaCaption
    a11y/useSemanticElements
    a11y/useValidAnchor
    a11y/useValidAriaProps
    a11y/useValidAriaRole
    a11y/useValidAriaValues
    a11y/useValidAutocomplete
    a11y/useValidLang
    complexity/noAdjacentSpacesInRegex
    complexity/noArguments
    complexity/noBannedTypes
    complexity/noCommaOperator
    complexity/noEmptyTypeParameters
    complexity/noExcessiveCognitiveComplexity
    complexity/noExtraBooleanCast
    complexity/noFlatMapIdentity
    complexity/noStaticOnlyClass
    complexity/noThisInStatic
    complexity/noUselessCatch
    complexity/noUselessConstructor
    complexity/noUselessContinue
    complexity/noUselessEmptyExport
    complexity/noUselessEscapeInRegex
    complexity/noUselessFragments
    complexity/noUselessLabel
    complexity/noUselessLoneBlockStatements
    complexity/noUselessRename
    complexity/noUselessStringRaw
    complexity/noUselessTernary
    complexity/noUselessThisAlias
    complexity/noUselessTypeConstraint
    complexity/noUselessUndefinedInitialization
    complexity/useArrowFunction
    complexity/useDateNow
    complexity/useFlatMap
    complexity/useNumericLiterals
    complexity/useOptionalChain
    complexity/useRegexLiterals
    complexity/useSimpleNumberKeys
    correctness/noChildrenProp
    correctness/noConstAssign
    correctness/noConstantCondition
    correctness/noConstantMathMinMaxClamp
    correctness/noConstructorReturn
    correctness/noEmptyCharacterClassInRegex
    correctness/noEmptyPattern
    correctness/noGlobalObjectCalls
    correctness/noInnerDeclarations
    correctness/noInvalidBuiltinInstantiation
    correctness/noInvalidConstructorSuper
    correctness/noInvalidDirectionInLinearGradient
    correctness/noInvalidGridAreas
    correctness/noInvalidPositionAtImportRule
    correctness/noInvalidUseBeforeDeclaration
    correctness/noMissingVarFunction
    correctness/noNonoctalDecimalEscape
    correctness/noPrecisionLoss
    correctness/noPrivateImports
    correctness/noSelfAssign
    correctness/noSetterReturn
    correctness/noStringCaseMismatch
    correctness/noSwitchDeclarations
    correctness/noUnknownFunction
    correctness/noUnknownMediaFeatureName
    correctness/noUnknownProperty
    correctness/noUnknownPseudoClass
    correctness/noUnknownPseudoElement
    correctness/noUnknownTypeSelector
    correctness/noUnknownUnit
    correctness/noUnmatchableAnbSelector
    correctness/noUnreachable
    correctness/noUnreachableSuper
    correctness/noUnsafeFinally
    correctness/noUnsafeOptionalChaining
    correctness/noUnusedFunctionParameters
    correctness/noUnusedImports
    correctness/noUnusedLabels
    correctness/noUnusedPrivateClassMembers
    correctness/noUnusedVariables
    correctness/noVoidElementsWithChildren
    correctness/noVoidTypeReturn
    correctness/useIsNan
    correctness/useValidForDirection
    correctness/useValidTypeof
    correctness/useYield
    nursery/noConstantBinaryExpression
    nursery/noShadow
    nursery/noTsIgnore
    nursery/useAdjacentGetterSetter
    nursery/useIndexOf
    nursery/useIterableCallbackReturn
    nursery/useObjectSpread
    performance/noAccumulatingSpread
    performance/noDelete
    performance/noDynamicNamespaceImportAccess
    performance/noNamespaceImport
    security/noBlankTarget
    security/noDangerouslySetInnerHtml
    security/noDangerouslySetInnerHtmlWithChildren
    security/noGlobalEval
    style/noDescendingSpecificity
    style/noInferrableTypes
    style/noRestrictedTypes
    style/noUnusedTemplateLiteral
    style/noUselessElse
    style/useArrayLiterals
    style/useAsConstAssertion
    style/useBlockStatements
    style/useConst
    style/useDefaultParameterLast
    style/useDeprecatedReason
    style/useExportType
    style/useImportType
    style/useLiteralEnumMembers
    style/useNumberNamespace
    style/useShorthandFunctionType
    suspicious/noApproximativeNumericConstant
    suspicious/noArrayIndexKey
    suspicious/noAsyncPromiseExecutor
    suspicious/noCatchAssign
    suspicious/noClassAssign
    suspicious/noCommentText
    suspicious/noCompareNegZero
    suspicious/noConfusingLabels
    suspicious/noConfusingVoidType
    suspicious/noConstEnum
    suspicious/noControlCharactersInRegex
    suspicious/noDebugger
    suspicious/noDoubleEquals
    suspicious/noDuplicateAtImportRules
    suspicious/noDuplicateCase
    suspicious/noDuplicateClassMembers
    suspicious/noDuplicateCustomProperties
    suspicious/noDuplicateElseIf
    suspicious/noDuplicateFields
    suspicious/noDuplicateFontNames
    suspicious/noDuplicateJsxProps
    suspicious/noDuplicateObjectKeys
    suspicious/noDuplicateParameters
    suspicious/noDuplicateProperties
    suspicious/noDuplicateSelectorsKeyframeBlock
    suspicious/noEmptyBlock
    suspicious/noEmptyInterface
    suspicious/noExtraNonNullAssertion
    suspicious/noFallthroughSwitchClause
    suspicious/noFunctionAssign
    suspicious/noGlobalAssign
    suspicious/noGlobalIsFinite
    suspicious/noImplicitAnyLet
    suspicious/noImportAssign
    suspicious/noImportantInKeyframe
    suspicious/noIrregularWhitespace
    suspicious/noLabelVar
    suspicious/noMisleadingCharacterClass
    suspicious/noMisleadingInstantiator
    suspicious/noMisrefactoredShorthandAssign
    suspicious/noOctalEscape
    suspicious/noRedeclare
    suspicious/noRedundantUseStrict
    suspicious/noSelfCompare
    suspicious/noShadowRestrictedNames
    suspicious/noShorthandPropertyOverrides
    suspicious/noSparseArray
    suspicious/noSuspiciousSemicolonInJsx
    suspicious/noTemplateCurlyInString
    suspicious/noThenProperty
    suspicious/noUnsafeDeclarationMerging
    suspicious/noUnsafeNegation
    suspicious/noVar
    suspicious/noWith
    suspicious/useAdjacentOverloadSignatures
    suspicious/useDefaultSwitchClauseLast
    suspicious/useGetterReturn
    suspicious/useGoogleFontDisplay
    suspicious/useIsArray
    suspicious/useNamespaceKeyword

Workspace:
  Open Documents:               0

Rule name

nursery/noShadow

Playground link

https://biomejs.dev/playground/?lineWidth=120&indentStyle=space&lintRules=noShadow&code=YwBsAGEAcwBzACAAZgBvAG8AIAB7AAoAIAAgAHAAcgBvAHAAOgAgAG4AdQBtAGIAZQByACAAfAAgAGIAbwBvAGwAZQBhAG4AOwAKAAoAIAAgAC8ALwAgAE8AdgBlAHIAbABvAGEAZABpAG4AZwAgAGEAIABjAG8AbgBzAHQAcgB1AGMAdABvAHIAIAB0AGgAcgBvAHcAcwAgAGUAcgByAG8AcgBzACAAdwBoAGUAbgAgAGYAdQB0AHUAcgBlACAAcABhAHIAYQBtAGUAdABlAHIAcwAgAG8AcgAgAHYAYQByAGkAYQBiAGwAZQBzACAAcwBoAGEAcgBlACAAdABoAGUAaQByACAAbgBhAG0AZQAsACAAZQB2AGUAbgAgAGkAbgAgAGYAdQB0AHUAcgBlACAAbQBlAHQAaABvAGQAcwAuAAoAIAAgAGMAbwBuAHMAdAByAHUAYwB0AG8AcgAoAHAAYQByAGEAbQAxADoAIABuAHUAbQBiAGUAcgApADsACgAgACAAYwBvAG4AcwB0AHIAdQBjAHQAbwByACgAbwB0AGgAZQByAE4AYQBtAGUAOgAgAGIAbwBvAGwAZQBhAG4AKQA7AAoAIAAgAGMAbwBuAHMAdAByAHUAYwB0AG8AcgAoAGQAbwBkAG8AOgAgAGIAbwBvAGwAZQBhAG4AKQA7AAoAIAAgAGMAbwBuAHMAdAByAHUAYwB0AG8AcgAoAHAAYQByAGEAbQAxADoAIABiAG8AbwBsAGUAYQBuACAAfAAgAG4AdQBtAGIAZQByACkAIAB7ACAALwAvACAARgBsAGEAZwBzACAAbABpAG4AZQAgADMACgAgACAAIAAgAHQAaABpAHMALgBwAHIAbwBwACAAPQAgAHAAYQByAGEAbQAxADsACgAgACAAIAAgAGMAbwBuAHMAdAAgAG8AdABoAGUAcgBOAGEAbQBlACAAPQAgADUAOwAgAC8ALwAgAEYAbABhAGcAcwAgAGwAaQBuAGUAIAA0AAoAIAAgAH0ACgAKACAAIABwAGEAcgBhAG0AMQAgAD0AIAA1ADsACgAKACAAIAAgAC8ALwAgAEEAbABsACAAbwBmACAAdABoAGUAcwBlACAAYQByAGUAIABmAGwAYQBnAGcAZQBkACAAYQBzACAAdwBlAGwAbAAuAC4ALgAhAAoAIAAgAG0AZQB0AGgAbwBkACgAcABhAHIAYQBtADEAOgAgAHMAdAByAGkAbgBnACkAOwAKACAAIABtAGUAdABoAG8AZAAoAG8AdABoAGUAcgBOAGEAbQBlADoAIABiAG8AbwBsAGUAYQBuACkAOwAKACAAIABtAGUAdABoAG8AZAAoAHAAYQByAGEAbQAxADoAIABzAHQAcgBpAG4AZwAgAHwAIABiAG8AbwBsAGUAYQBuACkAIAB7AAoAIAAgACAAIABsAGUAdAAgAGQAbwBkAG8AOgAgAG4AdQBtAGIAZQByADsAIAAvAC8AIABmAGwAYQBnAHMAIABhACAAcABhAHIAYQBtAGUAdABlAHIAIAB0AGgAYQB0ACAAZABvAGUAcwAgAG4AbwB0ACAAZQB2AGUAbgAgAGUAeABpAHMAdAAgAGEAdAAgAHIAdQBuAHQAaQBtAGUACgAgACAAfQAKAH0ACgAKAGMAbABhAHMAcwAgAGIAYQByACAAewAKACAAIAAvAC8AIABXAG8AcgBrAHMAIABpAGYAIABpAG0AcABsAGUAbQBlAG4AdABhAHQAaQBvAG4AIAB2AGEAcgBpAGEAYgBsAGUAcwAgAG4AYQBtAGUAZAAgAGQAaQBmAGYAZQByAGUAbgB0AGwAeQAuAC4ALgAKACAAIABjAG8AbgBzAHQAcgB1AGMAdABvAHIAKABhADoAIABuAHUAbQBiAGUAcgApADsACgAgACAAYwBvAG4AcwB0AHIAdQBjAHQAbwByACgAYgA6ACAAbgB1AG0AYgBlAHIAKQAgAHsAfQAKAAoAIAAgAC8ALwAgAGIAdQB0ACAAcwB0AGkAbABsACAAZQByAHIAbwByAHMAIABvAG4AIABzAHUAYgBzAGUAcQB1AGUAbgB0ACAAbQBlAHQAaABvAGQAcwAhAAoAIAAgAGQAbwBUAGgAaQBuAGcAKABhADoAIABuAHUAbQBiAGUAcgApACAAewB9AAoAfQAKAAoAYwBsAGEAcwBzACAAYgBhAHoAIAB7AAoAIAAgAHAAcgBpAHYAYQB0AGUAIABhAHAAcABsAGUAOgAgAG4AdQBsAGwAOwAKACAAIAAvAC8AIABXAG8AcgBrAHMAIABpAGYAIABuAG8AIABvAHYAZQByAGwAbwBhAGQAcwAgAHAAcgBvAHYAaQBkAGUAZAAuAC4ALgAKACAAIABjAG8AbgBzAHQAcgB1AGMAdABvAHIAKABhAHAAcABsAGUAOgAgAG4AdQBsAGwAKQAgAHsAfQAKAAoAIAAgAGIAYQBrAGUAQQBQAGkAZQAoAGEAcABwAGwAZQA6ACAAbgB1AGwAbAApACAAewB9AAoAfQAKAAoALwAvACAALgAuAC4AYQBuAGQAIAB3AG8AcgBrAHMAIABvAG4AIABuAG8AcgBtAGEAbAAgAG8AdgBlAHIAbABvAGEAZABlAGQAIABmAHUAbgBjAHQAaQBvAG4AcwAuAAoAZgB1AG4AYwB0AGkAbwBuACAAbwB2AGUAcgBsAG8AYQBkAGUAZAAoAHAAcgBvAHAAOgAgAHMAdAByAGkAbgBnACkAOwAKAGYAdQBuAGMAdABpAG8AbgAgAG8AdgBlAHIAbABvAGEAZABlAGQAKABwAHIAbwBwADoAIABuAHUAbQBiAGUAcgApADsACgBmAHUAbgBjAHQAaQBvAG4AIABvAHYAZQByAGwAbwBhAGQAZQBkACgAcAByAG8AcAA6ACAAcwB0AHIAaQBuAGcAIAB8ACAAbgB1AG0AYgBlAHIAKQAgAHsAfQA7AAoACgA%3D&language=ts

Expected result

Biome should probably not throw any errors within the constructor implementation, and certainly none within subsequent methods.

The overloaded parameters are nonexistent at runtime and serve as syntactic sugar, so little confusion should arise from something like

constructor(p1: string);
constructor(p1: number);
constructor(p1: unknown) {};

As for the errors on subsequent methods, using the same variable name in a subsequent method is still a wholly separate scope and thus not likely to be conflated.

class counter {
  private count: number;
  constructor (count: number);
  constructor (count: BigInt);
  constructor (count: any) {this.count = count};

  increment(count: number) {
    this.count += count
  }
}

This issue appears unique to Biome since typescript-eslint handles the exact same kind of overloaded constructors A-OK.

To clarify, something like this should probably still error:

class foo {
  constructor(a: string);
  constructor(a: number);
  constructor(a: unknown) {
    // shadows `a` in overload implementation parameter
    let a = 4;
  }
}

, merely that THIS shouldn't:

class foo {
  constructor(a: string);
  constructor(a: number);
  constructor(a: unknown) {}
}

I hope i didn't do too poorly with the request. this is my first time so a little nervous

Code of Conduct

  • I agree to follow Biome's Code of Conduct

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-LinterArea: linterL-JavaScriptLanguage: JavaScript and super languagesS-Bug-confirmedStatus: report has been confirmed as a valid bug

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions