ts 接口如何覆盖?

别人定义了一个接口中的参数,但是是模糊定义。

// @types/aaa
interface vcss {
    verticalAlign: string | null;
}

我需要改成

// vcss.d.ts
interface vcss {
    verticalAlign: 'top' | 'center' | 'bottom' | 'middle'
}

我如果直接写在项目里可以用。但是如果我发包就不行了。
image.png
在npm包里面,我发一个@types/bbb,然后在项目里面引用就失效了,为什么?
image.png

// package.json
{
  "name": "@types/bbb",
  "dependencies": {
    "@types/aaa": "^1.21.0"
  },
  "file":["*.d.ts"]
}
// index.d.ts
/// <reference types="@types/aaa" />
/// <reference path="vcss.d.ts" />

怎么样才能发布的情况下覆盖他的申明?其他属性不变

阅读 2.8k
1 个回答
✓ 已被采纳
在npm包里面,我发一个@types/bbb,然后在项目里面引用就失效了

这个是正常的,因为项目中查找 verticalAlign 类型定义时,发现了两处:一个是@types/aaa 一个是在 @types/bbb ,这两个包你都引用了。

解决的话,可以换个方式or思路,提供3个方式可参考下:

  1. 直接在项目里,声明一个 vcss.d.ts 文件即可,没必要再包装一个npm包。优点是简单明了,缺点就是每次项目中都需要 扩展/合并 这个 verticalAlign 类型。(推荐)
  2. @types/bbb 中不显式依赖 @types/aaa ,而是全部扩展/改写 @types/aaa
  3. 给 @types/aaa 提PR,矫正类型(推荐)
  4. fork @types/aaa ,单独发个包
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进