【问题标题】:Create a type with a discriminatory field by combining interfaces?通过组合接口来创建一个带有区分字段的类型?
【发布时间】:2019-11-12 20:43:21
【问题描述】:

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

这是我的代码:

/*
 * 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: 细绳;解决:(值?:IPersistence | 承诺喜欢> |未定义)=> 无效;拒绝: (原因?:任何)=> 无效; }' 不可分配给类型 'IChangeRequestPromiseProxy'。属性“changeFn”是 缺少类型'{ id:字符串;解决:(值?:IPersistence |承诺喜欢> |未定义)=> 无效;拒绝: (原因?:任何)=> 无效; }' 但在类型中是必需的 'IUpdateRequestPromiseProxy'.ts(2322) Queue.service.ts(16, 5): 这里声明了'changeFn'。

为什么这不起作用?

【问题讨论】:

    标签: typescript


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2019-07-14
      • 2016-01-10
      • 2021-06-27
      • 2020-08-28
      • 2020-10-30
      • 2014-12-25
      • 1970-01-01
      • 2016-01-05
      • 2018-01-07
      相关资源
      最近更新 更多