Typescript - 扩展现有模块声明

Typescript - Extending existing module declarations

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

我正在使用具有以下模块声明的 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' 的文件都可以在不导入我的文件的情况下获得扩展类型?

非常感谢任何帮助!

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

这个想法只是enrich Meteor.User 接口。因为该接口然后用作 Meteor.user() 函数的 return 类型和 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