【问题标题】:Typescript - Extending existing module declarationsTypescript - 扩展现有模块声明
【发布时间】:2022-01-14 15:06:52
【问题描述】:

我还在学习打字稿,所以我卡住了。网上也找不到。

我正在使用meteor js,它具有以下模块声明meteor.d.ts

declare module 'meteor/meteor' {
    type global_Error = Error;
    module Meteor {
        /** User **/
        interface UserEmail {
            address: string;
            verified: boolean;
        }
        interface User {
            _id: string;
            username?: string | undefined;
            emails?: UserEmail[] | undefined;
            createdAt?: Date | undefined;
            profile?: any;
            services?: any;
        }

        function user(options?: { fields?: Mongo.FieldSpecifier | undefined }): User | null;

        function userId(): string | null;
        var users: Mongo.Collection<User>;
        /** User **/
    }
}

现在我有一些额外的用户字段,所以我想用一些字段扩展模块 Meteor 中的用户界面:

interface UserAdditonal {
    field1: string
    field2: string
    field3: string
}

我该怎么做?我试过这个:

declare module "meteor/meteor" {
    module Meteor {
        function user(options?: {
            fields?: Mongo.FieldSpecifier | undefined
        }): (User & userAdditonal) | null

        var users: Mongo.Collection<User & userAdditonal>
    }
}

这会引发错误meteor.d.ts(56, 13): 'users' was also declared here.,并且也只能在同一个文件中使用。而且它更像是覆盖,而不是扩展

是否可以全局执行,所以我在一个文件中声明它,而所有其他导入“meteor/meteor”的文件在不导入我的文件的情况下获得扩展类型?

非常感谢任何帮助!

【问题讨论】:

    标签: typescript meteor


    【解决方案1】:

    是的,丰富您的 Meteor.users 集合是很常见的(尽管建议不要在其中放入太多数据),并且您绝对可以告诉 TypeScript 您添加了哪些额外的键。

    这个想法很简单,enrichMeteor.User 接口。因为该接口随后被用作Meteor.user() 函数的返回类型和Meteor.users 集合的文档类型(如您问题中定义的摘录所示),所以只要您使用它们,它将自动可用。

    // In a file that is imported somewhere
    
    declare module "meteor/meteor" {
      module Meteor {
        interface User {
          field1: string
          field2: string
          field3: string
        }
    
        // If you already have an existing interface that you want to "merge"
        // into Meteor.User:
        interface User extends UserAdditonal {}
      }
    }
    

    然后别忘了导入“meteor/meteor”模块,你的额外字段应该会自动可用:

    import { Meteor } from "meteor/meteor";
    
    Meteor.user().field1; // string
    
    Meteor.users.findOne().field2; // string
    

    【讨论】:

    • 感谢这项工作!只是一个问题,我将如何使用我已经定义的接口UserAdditonal 来扩展User 而不是像你那样定义字段 1,2,3 “内联”?
    • 查看更新的答案。
    • 很好,就像一个魅力。非常感谢!
    • 感谢您的好评!
    猜你喜欢
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多