Typescript typeRoots 优先级

Posted

技术标签:

【中文标题】Typescript typeRoots 优先级【英文标题】:Typescript typeRoots priority 【发布时间】:2021-03-12 20:16:30 【问题描述】:

我已经重新定义(扩展)了一些从 npm 加载的类,并附加了类型定义,但由于某种原因,我的定义的优先级低于来自 node_modules 的定义。

是否可以使用 typeRoots 属性或其他方式管理打字稿定义优先级?

一个例子:

我已经从 vue-router 包中导入了 VueRouter 并像这样扩展它:

export class Router extends VueRouter 
  pushWithCheck (location: RawLocation): Promise<Route | void> 
    return this.push(location)
      .catch((error: Error) => 
        if (error && error.name !== 'NavigationDuplicated') 
          throw error
         
      )
  

然后我在src/@types/vue.d.ts 中创建了文件,内容如下:

import Vue from 'vue'
import  Router  from '../router'

export 

declare module 'vue/types/vue' 
  interface Vue 
    $router: Router
  

然后更新tsconfig.json文件,添加typeRoots: ["./src/@types", "./node_modules/@types"](也按相反的顺序尝试)。

这就是我在 vs 代码中看到的:

【问题讨论】:

【参考方案1】:

接口需要在vue.d.ts中导出才能生效:

declare module 'vue/types/vue' 
  export interface Vue 
    $router: Router
  

【讨论】:

好的,我将 vue.d.ts 放置到每个以 root 开头的文件夹中,并且在根级别(与 tsconfig.json 所在的位置相同)它给出“后续属性声明必须具有相同的类型。属性“$router”必须是“VueRouter”类型,但这里有“Router”类型。”错误。也许你是对的,文件夹在某种程度上很重要。然后我在 tsconfig.json 中附加了 include: ["*.ts", ...] 并且一切都返回了。现在,当我右键单击 $router 时,有 4 个定义,但第一个仍然是 VueRouter,但不是我的任何一个。

以上是关于Typescript typeRoots 优先级的主要内容,如果未能解决你的问题,请参考以下文章

如何在 tsconfig.json 上启用 typeRoots 的 typescript/expressjs 应用程序上运行 jest

使用 Typescript 的 Webpack:两个配置中的通用设置,那么哪个优先?

typescript 泛型

TypeScript装饰器

TypeScript 泛型:'类型不可分配给类型 T'

TypeScript 泛型函数的类型