You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中类型与常量同名为何无Lint警告却报错?

问题:类型与变量同名为何触发TS报错?

我编写了如下代码:

import type { SomeType } from '../../types/Project';
// import { SomeType } from '../../types/Project'; 也试过这种写法

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

在Project.ts中的定义:

export type SomeType = JSX.Element;

为什么TypeScript linter没给出警告,却抛出错误:Identifier 'SomeType' has already been declared.?我原本以为类型和变量可以同名共存?


原因与解决方案

  • 核心原因:TypeScript的作用域规则中,类型标识符和值标识符(比如变量、函数、组件)共享同一个作用域命名空间,哪怕类型会在编译阶段被擦除,静态检查时依然会检测到重名冲突。

  • import type也触发的原因:import type虽然只导入类型,但会在当前作用域创建一个类型标识符,这个标识符和你后续声明的const SomeType(值标识符)重名,因此触发报错。

  • 可行解决办法:

    • 直接重命名:给组件或类型换个不冲突的名字,比如把组件改成SomeTypeComponent,或者把类型调整为SomeTypeProps(根据实际语义修改)。
    • 重命名导入:利用类型别名的导入重命名,避免作用域内重名:
      import type { SomeType as SomeTypeAlias } from '../../types/Project';
      
      const SomeType = ({ s }: { s: SomeTypeAlias }): JSX.Element => {
        return <>${s}</>;
      };
      

内容的提问来源于stack exchange,提问作者supersize

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 20:05:33