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