javascript - Varsle når en TypeScript-type og en konstant har samme navn i samme modul?


Jeg har

import type { SomeType } from '../../types/Project';
// import { SomeType } from '../../types/Project'; tried this too

const SomeType = ({ s }: { s: SomeType }): JSX.Element => {
  return <>${s}</>;
};

i Project.ts har jeg

export type SomeType = JSX.Element;

Hvorfor viser ikke TS-linteren noen advarsler, men den vil kaste en feil:

Identifier 'SomeType' has already been declared.

Jeg trodde typer og variabler kan eksistere samtidig med samme navn?

Eksempel: https://codesandbox.io/s/objective-glade-y94j58?file=/src/App.tsx

Svar #1

Mens løsningen @Joel ga er en mulig løsning, tror jeg ikke den korrekt svarer på spørsmålet ved å si «Nei».

Ta en titt på svarene her

Svaret på spørsmålet ditt er JA, du kan ha en type og en variabel med samme navn siden TS-typing fjernes ved kompilering (i motsetning til variabler).

Det du leter etter er følgende ESLint-regel: no-shadow

// .eslintrc.js
module.exports = {
  "rules": {
    ...<your_other_rules>,
    // Note: you must disable the base rule as it can report incorrect errors
    "no-shadow": "off",
    "@typescript-eslint/no-shadow": ["off", { ignoreTypeValueShadow: true, ignoreFunctionTypeParameterNameValueShadow: true }]
  }
};

Svar #2

Enkelt svar, nei

Selv om det erklæres som en type, må SomeType ha en tilgjengelig identifikator (altså et navn som ikke allerede er i bruk i det nåværende området).

Hvis du ikke kan endre navnet på typen eller på variabelen, kan du gi den et alias.

import type { SomeType as SameTypeWithOtherName } from '../../types/Project';

const SomeType = ({ s }: { s: SameTypeWithOtherName }): JSX.Element => {
  return <>${s}</>;
};

Relaterte artikler