TS4023:导出的变量 <x> 具有或正在使用来自外部模块的名称 <y>,但无法命名

Posted

技术标签:

【中文标题】TS4023:导出的变量 <x> 具有或正在使用来自外部模块的名称 <y>,但无法命名【英文标题】:TS4023: Exported Variable <x> has or is using name <y> from external module but cannot be named 【发布时间】:2017-10-09 13:09:46 【问题描述】:

我以前看过这个回答,但他们似乎没有涵盖这个特定的用例(或者他们不工作/帮助)

import Route from 'vue-router';


export const detailRoute = 
  path: '/detail/:id',
  component: Detail,
  props: (route: Route) => (
    state: route.query.state
  )
;

detailRoute 使用了我正在导入的 Route,但我猜想作为命名导入 Route 它不起作用?有没有一种不同/更好的方法可以做到这一点?我也试过export Route;,但没有帮助。

tsconfig.json:

    
      "compilerOptions": 
        "target": "ES2017",
        "module": "ES2015",
        "moduleResolution": "Node",
        "sourceMap": true,
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "forceConsistentCasingInFileNames": true,
        "allowSyntheticDefaultImports": true,
        "noEmitHelpers": true,
        "importHelpers": true,
        "pretty": true,
        "alwaysStrict": true,
        "declaration": true,
        "declarationDir": "./types",
        "lib": [
          "DOM",
          "ES2017",
          "DOM.Iterable",
          "ScriptHost"
        ],
        "baseUrl": "./client",
        "paths": 
          "styles/*": ["./app/core/styles/*"],
          "core/*": ["./app/core/*"],
          "components/*": ["./app/components/*"],
          "containers/*": ["./app/containers/*"],
          "assets/*": ["./assets/*"],
          "config/*": ["./config/*"]
        
      
    

确切的错误:

TS4023: Exported variable 'detailRoute' has or is using name 'Route' from external module "/Users/chris/&lt;projectname&gt;/node_modules/vue-router/types/router" but cannot be named.

【问题讨论】:

从 GitHub 看到这个解决方案:github.com/Microsoft/TypeScript/issues/5711 谢谢,这就是我开始的地方,但它似乎没有帮助,或者我错过了一些东西。我导入了 Route,我尝试导出 Route,我不知道我还能做些什么来说“Route is in this”。 我无法重现您的问题。我正在使用 TypeScript 2.3 和 commonjs 模块。你在用什么? ES6 模块,节点解析,声明 = true; 【参考方案1】:

编译器无法确定detailRoute 的确切形状,因为它不知道Route 的形状。

选项 1

解决此问题的一种方法是从其源导入Route,从而提供编译器确定detailRoute 形状所需的信息。

import  Route  from "./../node_modules/vue-router/types/router";

export const detailRoute = 
  props: (route: Route) => null,
;

由于the index.d.ts file in vue-router(您在问题中导入)重新导出Route,它不提供编译器需要的对Route直接引用。

选项 2

另一种选择是让detailRoute 完全不使用静态类型。

import  Route  from 'vue-router'; // index.d.ts

export const detailRoute: any = 
  props: (route: Route) => null,
;

由于any 选择退出静态类型,编译器不需要弄清楚detailRoute 的形状。

选项 3

另一个选项是您在自己的答案中所做的。由于您提供了类型注释,因此编译器无需再次计算detailRoute 的形状。

import  Route, RouteConfig  from 'vue-router'; // index.d.ts

export const detailRoute: RouteConfig = 
  props: (route: Route) => null,
;

另见

https://github.com/Microsoft/TypeScript/issues/5711

当试图发出 [模块] 时,编译器需要编写一个对象类型字面量……表示模块的形状。但是范围内并没有直接引用[Route]的名称,所以类型“无法命名”,出现错误。

如果您添加 [Route] 的 [a direct] import ... 错误应该会消失。

【讨论】:

【参考方案2】:

显然这是我的问题的解决方案:

  import Route, RouteConfig from 'vue-router';


  export const detailRoute: RouteConfig = 
    path: '/detail/:id',
    component: Detail,
    props: (route: Route) => (
      state: route.query.state
    )
  ;

指定 detailRoute 是一个 RouteConfig(它又使用 Route)解决了这个问题。我一定误解了它应该如何工作,但这解决了它。

【讨论】:

【参考方案3】:

我在输入 rootReducer 时遇到了这个问题,以防其他人也这样做。我正在导入由我还没有导出的其他类型(状态、动作)组成的类型化减速器。

简答:从 reducer 中导出所有 actionstate 类型!

当复合类型的部分也未导出并且您依赖类型推断时,复合类型似乎无法正常工作。在这种情况下,推断 rootReducer 的类型(如果你有多个 reducer,那么显式类型就太多了)。

const rootReducer = combineReducers( typedReducerA, typedReducerB, ... 

【讨论】:

我也在处理减速器问题,我的解决方案是在尝试扩展之前从 RootState 中删除唯一符号。我的解决方案是:Subtract&lt;RootState, CombinedState&lt;&gt;&gt;Subtract 来自 utility-types npm 包【参考方案4】:

对我来说,这个问题是因为我正在尝试构建一个库:

interface Props ...;
const MyComponent = (...:Props)=><>...</>

我改成:

type Props = ...;

问题已解决。

【讨论】:

这很奇怪,但它为我解决了问题。

以上是关于TS4023:导出的变量 <x> 具有或正在使用来自外部模块的名称 <y>,但无法命名的主要内容,如果未能解决你的问题,请参考以下文章

添加具有 TS 属性 Angular 7 的 css 类名

打字稿:如何导出变量

ts 自学笔记

Ts泛型函数

具有动态变量名称的 r dplyr 过滤器

C ++参数包,仅限于具有单一类型的实例?