javascript - 扩展 typescriptdefineTyped 定义文件

标签 javascript node.js typescript definitelytyped

我收到以下错误:

src/models/priceAdjustment.ts(55,2): error TS2345: Argument of type '{ as: string; foreignKey: string; gql: any; }' is not assignable to parameter of type 'AssociationOptionsHasMany'. Object literal may only specify known properties, and 'gql' does not exist in type 'AssociationOptionsHasMany'.

错误很明显,我正在尝试分配一个不存在的“gql” key (我将其附加到上面,以便稍后可以在其他地方的代码中访问它)。

我想做的是扩展 model.hasMany interface here ,并添加我自己的 key 。这可能吗?如果是这样,我该怎么办?

我当前的解决方法是将对象强制转换为 <any>在传递它之前,这感觉像是一个肮脏的解决方法。

我尝试了以下操作:

import Sequelize from 'sequelize';

export declare module Sequelize {
    export interface MyAssociationOptionsHasMany extends Sequelize.AssociationOptionsHasMany {
        gql?: any
    }
    export interface MyAssociations extends Sequelize.Associations {
        hasMany(target: Sequelize.Model<any, any>, options?: MyAssociationOptionsHasMany): void;
    }
}

现在我收到以下错误:

TypeError: Cannot read property '239' of undefined
    at getDeclarationSpaces (C:\Users\user\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:33121:54)
    at checkExportsOnMergedDeclarations (C:\Users\user\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:33067:41)
    at checkModuleDeclaration (C:\Users\user\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:35036:17)
    at checkSourceElement (C:\Users\user\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:35505:28)
    at Object.forEach (C:\Users\user\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:275:30)
    at checkSourceFileWorker (C:\Users\user\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:35566:20)
    at checkSourceFile (C:\Users\user\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:35551:13)
    at getDiagnosticsWorker (C:\Users\user\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:35604:17)
    at Object.getDiagnostics (C:\Users\user\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:35593:24)
    at C:\Users\user\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:56188:85

最佳答案

您可以通过 Declaration Merging 执行此操作。我发现这个工作的最好方法是将库导入到“扩展”文件中并从那里扩展库。例如,

extensions/library-name.extension.ts:

import AssociationOptionsHasMany from '/path/to/definition';
import 'library-name';

declare module 'library-name' {
  interface InterfaceToExtend {
    hasMany(options: AssociationOptionsHasMany): ReturnType;
  }
}

在上面的示例中,我们想要扩展在 library-name 模块中创建的接口(interface)。由于我们使用导入,TypeScript 会自动为该文件创建一个模块,因此我们必须告诉 TypeScript 我们要扩展 library-name 模块中的接口(interface),而不是为此文件创建的模块。为此,我们只需使用与我们导入的库相同的名称来声明该模块。

在告诉 TypeScript 应该在哪个模块中扩展接口(interface)之后,我们只需定义一个与应该扩展的接口(interface)同名的接口(interface)并添加我们需要的任何内容即可使用声明合并。在本例中,这将是一个新方法,它将我们想要传递的特定类型作为参数。

我还必须更新 tsconfig.json 文件,以便首先加载扩展。您可以通过在应用程序的其余部分之前包含 extensions 目录来实现此目的:

{
  /* Blah, settings, blah */
  includes: ['./app/extensions/*.ts', './app/**/*.ts'],
  /* Blah, settings, blah */
}

如果您使用 Sublime,它可能仍然会提示,但实际上编译代码或退出 Sublime 并重新打开它似乎工作得很好。

警告。声明合并功能强大,但可能会导致意外行为。一般来说,尽量避免扩展您(或其他人)在其他地方定义的组件。如果可能表明您不正确地使用这些组件或需要重构。请记住,TypeScript 的好处是严格的输入。

关于javascript - 扩展 typescriptdefineTyped 定义文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47422588/

相关文章:

typescript - webpack 捆绑后如何解析迁移文件夹的路径

javascript - 如何将 HTML 表单(JSON 格式)中的数据分配给变量?

javascript - 如何在 Node xmpp花名册中添加联系人?

javascript - ApolloClient 客户端类型

javascript - 如何将成员的所有函数公开为类自己的函数?

javascript - 将函数调用的结果作为 javascript/node.js 中的函数进行调用

javascript - 使用 cookie 和 JavaScript 的响应图像

javascript - 为什么我的原型(prototype)不起作用?

Javascript - 从 json 响应中提取 html 元素

node.js - 在 React 和 Node 中使用 Route Handler