打字稿 - 相交类型中的矛盾方法签名



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>;
}

您可以看到,createpatch方法应发生冲突,因为它们会生成相同的JavaScript。

为什么类型别名Service<T>编译,而当试图实施它时,由于方法冲突而失败?如果我精确地从每个接口复制这些方法并提供一个存根实现,则应使用否?

在打字稿中,类型与函数签名的交点对应于使这些功能超载。从相关的GitHub问题引入相交类型:

呼叫并构造签名

如果A具有签名F,并且B具有签名G,则A & B的签名为FG(以该顺序为单位(除了签名顺序外,类型A & BB & 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
}

希望有帮助;祝你好运!

相关内容

  • 没有找到相关文章

最新更新