javascript - Avertizează când un tip TypeScript și o constantă au același nume în același modul?


Eu am

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

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

în Project.ts am

export type SomeType = JSX.Element;

De ce linterul TS nu afișează nicio avertizare, dar va arunca o eroare:

Identifier 'SomeType' has already been declared.

Am crezut că tipurile și variabilele pot coexista cu același nume?

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

Răspuns #1

Deși soluția oferită de @Joel este o soluție posibilă, nu cred că răspunde corect la întrebare spunând „Nu”.

Aruncă o privire la răspunsurile de aici

Răspunsul la întrebarea ta este DA, poți avea un tip și o variabilă cu același nume, deoarece tipizarea în TS va fi eliminată la timpul de compilare (spre deosebire de variabile).

Ceea ce cauți este următoarea regulă ESLint: 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 }]
  }
};

Răspuns #2

Răspuns simplu, nu

Chiar dacă este declarat ca un tip, SomeType trebuie să aibă un identificator disponibil (adică un nume care nu este deja folosit în domeniul curent).

Dacă nu poți schimba numele tipului sau al variabilei, îl poți aliasa.

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

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