首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展类型记录definitelyTyped定义文件

扩展类型记录definitelyTyped定义文件
EN

Stack Overflow用户
提问于 2017-11-21 20:57:37
回答 1查看 1.7K关注 0票数 0

我得到了以下错误:

src/model/priceAdapment.ts(55,2):error TS2345:类型'{ as: string;foreignKey: string;gql: any;}‘的参数不能分配给类型'AssociationOptionsHasMany’的参数。对象文字只能指定已知的属性,并且'gql‘不存在于'AssociationOptionsHasMany’类型中。

错误很明显,我试图分配一个不存在的"gql“键(我将它附加在上面,以便以后在代码中访问它)。

我想做的是扩展界面在这里,并添加我自己的密钥。这个是可能的吗?如果是的话,我该怎么做?

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

我尝试了以下几点:

代码语言:javascript
复制
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;
    }
}

现在我得到了以下错误:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2017-11-22 00:34:33

你可以通过声明合并来完成这个任务。最好的方法是将库导入到一个“扩展名”文件中,然后从那里扩展库。例如,

extensions/library-name.extension.ts

代码语言:javascript
复制
import AssociationOptionsHasMany from '/path/to/definition';
import 'library-name';

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

在上面的示例中,我们希望扩展在library-name模块中创建的接口。由于我们使用导入,TypeScript会自动为文件创建一个模块,因此我们必须告诉TypeScript,我们希望扩展library-name模块中的接口,而不是为该文件创建的模块。要做到这一点,我们只需使用与导入的库同名的declare模块即可。

在告诉TypeScript应该在哪个模块中扩展接口之后,我们只需使用声明合并,方法是定义一个与应该扩展的接口同名的接口,并向它添加我们需要的任何内容。在这种情况下,这将是一个新的方法,它以我们希望传递它的特定类型作为参数。

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

代码语言:javascript
复制
{
  /* Blah, settings, blah */
  includes: ['./app/extensions/*.ts', './app/**/*.ts'],
  /* Blah, settings, blah */
}

如果您使用的是崇高,它可能仍然会抱怨,但实际上编译代码或退出Sublime并重新打开它似乎很好。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47422588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档