首页 > 解决方案 > 通过组合接口来创建一个带有区分字段的类型?

问题描述

通过组合接口来创建一个带有区分字段的类型?

这是我的代码:

/*
 * Missing changeFn indicates delete
 */
type IChangeRequestPromiseProxy<TEntity extends IBaseEntity> =
    | IUpdateRequestPromiseProxy<TEntity>
    | IDeleteRequestPromiseProxy;

interface IUpdateRequestPromiseProxy<TEntity extends IBaseEntity> {
    id: Id;
    resolve(value: IPersistence<TEntity>): void;
    reject(reason: any): void;
    changeFn(entity: TEntity): IPersistence<TEntity>;
}

interface IDeleteRequestPromiseProxy {
    id: Id;
    resolve(value: void): void;
    reject(reason: any): void;
    changeFn(entity: never): never;
}

let promiseProxy: IChangeRequestPromiseProxy<TEntity> = { id, resolve, reject };

这是我得到的错误。要点似乎是Property 'changeFn' is missing in type

让 promiseProxy: IChangeRequestPromiseProxy Type '{ id: string; 解决:(值?:IPersistence | PromiseLike> | undefined)=> void;拒绝:(原因?:任何)=> 无效;}' 不可分配给类型 'IChangeRequestPromiseProxy'。'{ id: string; 类型中缺少属性 'changeFn' 解决:(值?:IPersistence | PromiseLike> | undefined)=> void;拒绝:(原因?:任何)=> 无效;}' 但在 'IUpdateRequestPromiseProxy'.ts(2322) Queue.service.ts(16, 5) 类型中是必需的:此处声明了 'changeFn'。

为什么这不起作用?

标签: typescript

解决方案


changeFn(entity: never): never;不会使该属性成为changeFn可选的。要使其成为可选,您可以使用声明它,?并且由于您实际上不需要任何值,因此它应该是类型undefined

从您的问题中添加缺少的类型,它看起来像:

type IChangeRequestPromiseProxy<TEntity extends IBaseEntity> =
    | IUpdateRequestPromiseProxy<TEntity>
    | IDeleteRequestPromiseProxy;

interface IUpdateRequestPromiseProxy<TEntity extends IBaseEntity> {
    id: Id;
    resolve(value: IPersistence<TEntity>): void;
    reject(reason: any): void;
    changeFn(entity: TEntity): IPersistence<TEntity>;
}

interface IDeleteRequestPromiseProxy {
    id: Id;
    resolve(value: void): void;
    reject(reason: any): void;
    changeFn?:undefined;
}

interface IBaseEntity {}
class Entity { }
interface IPersistence<T> { o: T}
type Id = string;
declare const id: string;
declare const resolve: (value: void) =>  void;
declare const reject: (value: any) =>  void;

let promiseProxy: IChangeRequestPromiseProxy<Entity> = { id, resolve, reject };

推荐阅读