缩小外部模块提供的接口上的类型

时间:2019-04-14 08:35:53

标签: typescript

我有一个外部模块(从@types/some-module安装)。我想在该模块的命名空间内扩展一个接口,以使该接口上的属性之一比该模块提供的属性更窄。

Here's a Playground Link

// original.d.ts
namespace SomeNamespace {
  interface SomeInterface {
    id: string;
  }
}

// my.d.ts
declare module 'some-module' {
  namespace SomeNamespace {
    interface SomeInterface {
      id: 'foo' | 'bar'; // what I want to do
    }
  }
}

我可以预见的是一个错误

Subsequent property declarations must have the same type.  Property
'id' must be of type 'string', but here has type '"foo" | "bar"'. ts(2717)

有可能吗?我尝试添加unknown甚至any,但它不接受。

2 个答案:

答案 0 :(得分:0)

模块扩充允许您添加到接口,但不能更改现有成员类型。您唯一的选择是扩展接口,并在适当的情况下将类型声明用于您的派生接口。

答案 1 :(得分:0)

不幸的是,'foo'|'bar'不是字符串类型,联合类型的工作方式更像打字稿中的枚举。

最好的想法是将id限制为'foo'|'bar'的工厂方法。
不幸的是,我没有想法来帮助您自动完成这些值。