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
我还在学习打字稿,所以卡住了。在网上也找不到任何东西。
我正在使用具有以下模块声明的 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