i使用feathersjs(很棒(,但不幸的是,它不是用打字稿编写的,因此必须单独编写和维护键入。
这是打字文件。在其中,有一种Service<T>
类型,看起来像:
export type Service<T> = ServiceOverloads<T> & ServiceAddons<T> & ServiceMethods<T>;
ServiceOverloads<T>
看起来像:
export interface ServiceOverloads<T> {
create(data: Array<Partial<T>>, params?: Params): Promise<T[]>;
create(data: Partial<T>, params?: Params): Promise<T>;
patch(id: NullableId, data: Pick<T, keyof T>, params?: Params): Promise<T>;
}
和ServiceMethods<T>
看起来像:
export interface ServiceMethods<T> {
find(params?: Params): Promise<T[] | Paginated<T>>;
get(id: Id, params?: Params): Promise<T>;
create(data: Partial<T> | Array<Partial<T>>, params?: Params): Promise<T | T[]>;
update(id: NullableId, data: T, params?: Params): Promise<T>;
patch(id: NullableId, data: Partial<T>, params?: Params): Promise<T>;
remove(id: NullableId, params?: Params): Promise<T>;
}
您可以看到,create
和patch
方法应发生冲突,因为它们会生成相同的JavaScript。
为什么类型别名Service<T>
编译,而当试图实施它时,由于方法冲突而失败?如果我精确地从每个接口复制这些方法并提供一个存根实现,则应使用否?
在打字稿中,类型与函数签名的交点对应于使这些功能超载。从相关的GitHub问题引入相交类型:
呼叫并构造签名
如果
A
具有签名F
,并且B
具有签名G
,则A & B
的签名为F
和G
(以该顺序为单位(除了签名顺序外,类型A & B
和B & A
等于。
在您的情况下, ServiceOverloads<T> & ServiceMethods<T>
有效
{
create(data: Array<Partial<T>>, params?: Params): Promise<T[]>;
create(data: Partial<T>, params?: Params): Promise<T>;
create(data: Partial<T> | Array<Partial<T>>, params?: Params): Promise<T | T[]>;
patch(id: NullableId, data: Pick<T, keyof T>, params?: Params): Promise<T>;
patch(id: NullableId, data: Partial<T>, params?: Params): Promise<T>;
find(params?: Params): Promise<T[] | Paginated<T>>;
get(id: Id, params?: Params): Promise<T>;
update(id: NullableId, data: T, params?: Params): Promise<T>;
remove(id: NullableId, params?: Params): Promise<T>;
}
因此,您需要在create()
和patch()
是超载方法而不是单签名方法的情况下实现它。这是一个样本:
class ServiceImpl<T> {
create(data: Array<Partial<T>>, params?: Params): Promise<T[]>;
create(data: Partial<T>, params?: Params): Promise<T>;
create(data: Partial<T> | Array<Partial<T>>, params?: Params): Promise<T | T[]>;
create(data: Partial<T> | Array<Partial<T>>, params?: Params) : Promise<T> | Promise<T[]> {
return null!; // impl
}
patch(id: NullableId, data: Pick<T, keyof T>, params?: Params): Promise<T>;
patch(id: NullableId, data: Partial<T>, params?: Params): Promise<T>;
patch(id: NullableId, data: Pick<T, keyof T> | Partial<T>, params?: Params): Promise<T> {
return null!; // impl
}
// other methods
}
function getService<T>(): Service<T> {
return new ServiceImpl<T>(); // okay
}
希望有帮助;祝你好运!