ts 接口如何覆盖?

作者站长头像
站长
· 阅读数 13

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

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

我需要改成

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

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

// 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" />

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

回复
1个回答
avatar
test
2024-07-18
在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 ,单独发个包
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容