NodeJS 如何覆盖现有的node_module接口属性

64jmpszr  于 2022-11-04  发布在  Node.js
关注(0)|答案(1)|浏览(235)

我有一个自定义类型声明文件,我想在其中重写一个已经存在的接口属性(不是创建一个新属性,而是修改现有属性)
我已经尝试了几种方法,如省略属性(如下所示),但都没有成功。

src/types/example.d.ts
----------

import package, { AnInterface } from 'example'

interface CustomInstance extends Omit<Instance, 'clients'> {
  clients: string[];
}

declare module "example-module" {
  export interface Instance extends CustomInstance {
    test: number
    clients: CustomType
  }
}

src/main.ts
-----------

example.test // number as expected 
example.clients // is always the type from node_modules, not my .d.ts file

如果我尝试添加clients而不进行任何扩展,则会得到Subsequent property declarations must have the same type. Property 'clients' must be of type 'EDictionary', but here has type 'CustomType'
然而,如果我尝试扩展自定义示例(如上所述),我会得到错误Type 'Instance' recursively references itself as a base type.(即使我是ts-ignore,我的应用程序仍将使用node_modules中定义的类型)。

3bygqnnd

3bygqnnd1#

你不能用d.ts来“取消定义",你只能更精确地定义它。
最好的删除方法是重新导出模块中的所有内容,更改其类型
在您的情况下,您可能不想取消clients的定义,而是想缩小它的范围,那么这将是

import { EDictionary } from 'example-module';

declare module "example-module" {
  export interface Instance { // i.e. extends example-module.Instance
    test: number
    clients: CustomType & EDictionary // narrow it down in a compatible manner
  }
}

相关问题