【发布时间】:2019-02-25 02:13:58
【问题描述】:
在我的 TypeScript 项目中,我创建了一个自定义类(顺便说一下,受 Rust 的 Result<T, E> 启发),它看起来像这样:
export class Result<T, E extends Error = Error>
{
public errors: E[] = [];
public result: T | null = null;
public static ok<T, E extends Error>(result: T): Result<T, E>
{
return new Result(result, [] as E[]);
}
public static err<T, E extends Error>(...errors: E[]): Result<T, E>
{
return new Result<T, E>(null as unknown as T, errors);
}
public static apiErr<T>(...errors: ApiErrorKind[]): Result<T, ApiError>
{
return new Result<T, ApiError>(null as unknown as T, errors.map(e => new ApiError(e)));
}
private constructor(result: T | null, errors: E[])
{
this.result = result;
this.errors = errors;
}
public and<T2, E2 extends Error = E>(f: (x: T) => Result<T2, E2>): Result<T2, E | E2>
{
if (this.isErr)
return Result.err(...this.errors);
let errors: (E | E2)[] = this.errors;
try
{
return f(this.result as T);
}
catch (e)
{
errors.push(e as E2);
}
return Result.err(...errors);
}
// irrelevant methods omitted for brevity
public then<T2, E2 extends Error = E>(f: (x: T | null) => T2): Result<T2, E | E2>
{
if (this.isErr)
return Result.err(...this.errors);
let errors: (E | E2)[] = this.errors;
try
{
return Result.ok(f(this.result));
}
catch (e)
{
errors.push(e as E2);
}
return Result.err(...errors);
}
}
但是,每当我尝试使用它时,我总是收到关于 null 转换的神秘错误,尽管没有看到任何 null:
export async function createUser(input: UserInput, organization: string): Promise<Result<User, ApiError>>
{
const validation = validateUser(input); // returns Result<boolean, ApiError>
if (validation.isErr)
return Result.err<User, ApiError>(... validation.errors); // Error on this line
}
TS2322 输入“用户 | null' 不可分配给类型 'Result'。类型“null”不能分配给类型“Result”。
为什么会这样?
【问题讨论】:
-
你使用的是什么版本的 TypeScript?
-
我在本地机器上运行了您的代码示例,但没有看到您遇到的错误。
-
@ShaunLuttin 3.3.3333
标签: typescript