![](/img/trans.png)
[英]How to make an optional arg case generic type is void for a function in 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上提供了一个链接
为此,您需要重载constructor
和ok
方法:
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.