繁体   English   中英

通用 void 类型如何使 arg 在 typescript 中成为可选

[英]How a generic void type can make an arg optional in typescript

我正在尝试创建一个 class ,它返回一个接收泛型类型参数的实例,有时这个参数可能不存在,我不想留下可能未定义的,所以我认为使用 void,但它会抛出。

问题是当泛型类型为空时我需要提供未定义的值。


class Result<A>{

  private constructor(private readonly data: A){}

  static ok<A>(data: A): Result<A> {
    return new Result<A>(data);
  }

  print(): void {
    console.log(this.data ?? 'void');
  }
}

interface IUseCase<A> {
  execute(): Result<A>;
}

class UseCaseVoid implements IUseCase<void> {

  execute(): Result<void> {
    
    // Here is the problem. I need to provide undefined value
    const result = Result.ok(undefined);

    result.print();

    return result;
  }
}

class UseCaseString implements IUseCase<string> {

  execute(): Result<string> {

    const result = Result.ok('string');
    result.print();
    return result;

  }
}


const useCaseVoid = new UseCaseVoid();

useCaseVoid.execute(); // print void

const useCaseStr = new UseCaseString();

useCaseStr.execute(); // print string

是否可以只使用没有参数的 Result.ok() ?

游乐场Playground Example Here上提供了一个链接

为此,您需要重载constructorok方法:



class Result<A = void>{
  private readonly data: A | void;
  private constructor()
  private constructor(data: A)
  private constructor(data?: A) {
    this.data = data;
  }

  static ok(): Result<void>
  static ok<A>(data:A): Result<A>
  static ok<A>(data?: A) {
    return new Result(data);
  }
  print() {
    console.log(this.data ?? 'void');
  }
}

interface IUseCase<A> {
  execute(): Result<A>;
}

class UseCaseVoid implements IUseCase<void> {
  execute(): Result<void> {
    const result = Result.ok();
    result.print();
    return result;
  }
}

class UseCaseString implements IUseCase<string> {
  execute(): Result<string> {
    const result = Result.ok('a');
    result.print();
    return result;
  }
}


const useCaseVoid = new UseCaseVoid();

useCaseVoid.execute(); // print void

const useCaseStr = new UseCaseString();

useCaseStr.execute(); // print string


操场

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM