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

TypeScript TS4023错误:如何关闭该错误或修复代码?

解决TS4023类型错误:Exported variable依赖外部模块未导出类型的问题

问题场景

相关代码如下:

feature1.slice.ts

//feature1.slice.ts

import { createGenericSlice } from '@me/data-rtk';

/* ***********************For Storing all the divisions data****************************** */
export const divisionDataSlice = createGenericSlice({
  name: 'divisiondata',
  initialState: { status: 'loading' },
} )({
  setDivisionData(state, { payload }) {
    state.data = payload;
  },
});

@me/data-rtk 文件

//@me/data-rtk File
interface GenericState<T> {
  data?: T;
  status: 'loading' | 'finished' | 'error';
}

type Obj = Record<string, any>;

export const createGenericSlice = <D extends Obj, T extends Obj>({
  name = '',
  initialState,
}: {
  name: string;
  initialState: GenericState<T>;
}) => {
  return // Reducers 创建逻辑
}

打包时出现以下错误:

Error during bundle: Error: feature1.slice.ts(4, 14): semantic error TS4023: Exported variable 'divisionDataSlice' has or is using name 'GenericState' from external module "rtk-slice" but cannot be named.

解决方案

一、通过tsconfig关闭该错误

如果不需要生成类型声明文件(.d.ts),可以直接关闭声明文件生成:
在tsconfig.json的compilerOptions中添加:

{
  "compilerOptions": {
    "declaration": false
  }
}

如果需要保留声明文件,可尝试开启skipLibCheck跳过库文件的类型检查,但这可能会隐藏其他潜在问题:

{
  "compilerOptions": {
    "skipLibCheck": true
  }
}

二、代码层面修复(推荐)

错误根源是divisionDataSlice导出的类型依赖了@me/data-rtk中未导出的GenericState接口,可通过以下方式修复:

方式1:导出GenericState接口

在@me/data-rtk文件中,将GenericState改为导出接口:

// @me/data-rtk File
export interface GenericState<T> {
  data?: T;
  status: 'loading' | 'finished' | 'error';
}

// 其余代码保持不变

这样外部模块能访问到该类型,TS将不再报错。

方式2:隐藏createGenericSlice的内部类型依赖

如果不想导出GenericState,可以在createGenericSlice中确保返回的类型不依赖未导出的接口。例如,显式定义返回类型,或让TS自动推断不包含内部类型的结构:

// @me/data-rtk File
interface GenericState<T> {
  data?: T;
  status: 'loading' | 'finished' | 'error';
}

type Obj = Record<string, any>;

// 假设使用Redux Toolkit的createSlice,示例返回类型调整
import { createSlice, Slice } from '@reduxjs/toolkit';

export const createGenericSlice = <D extends Obj, T extends Obj>({
  name = '',
  initialState,
}: {
  name: string;
  initialState: GenericState<T>;
}): Slice<GenericState<T>, D> => {
  const slice = createSlice({
    name,
    initialState,
    reducers: {}
  });
  // 合并传入的额外reducers后返回
  return slice;
};

通过显式指定返回类型,确保内部类型被包裹在公开的类型结构中。

方式3:使用时显式指定泛型参数

在feature1.slice.ts中,显式为createGenericSlice指定泛型参数,避免TS自动推断依赖未导出的GenericState:

// feature1.slice.ts
import { createGenericSlice } from '@me/data-rtk';

export const divisionDataSlice = createGenericSlice<{}, { status: 'loading' }>({
  name: 'divisiondata',
  initialState: { status: 'loading' },
})({
  setDivisionData(state, { payload }) {
    state.data = payload;
  },
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 19:40:57