gpt4 book ai didi

typescript - 为什么 TypeScript 接受重写方法的正确返回,即使它不可访问?

转载 作者:行者123 更新时间:2023-12-04 00:58:54 25 4
gpt4 key购买 nike

我已经实现了一个抽象的通用 RESTClient。有时并非所有 REST 操作都已实现,因此我想在这种情况下抛出错误。

如果我覆盖了 TypeScript 期望我返回指定类型的方法,即使我抛出了错误。如果我添加 return null,它会编译,但无法返回。

export class RESTClient<E extends { id: number }, D = Omit<E, 'id'>> extends Client {
protected path: string;
public constructor(path: string, token?: string) {
super(token);
this.path = path;
}

public update(entity: E) {
return this.clientInstance.put<E>(`${this.path}/${entity.id}`, entity);
}
}

export class ItemClient extends RESTClient<Item> {
public constructor(token?: string) {
super('items', token);
}

// eslint-disable-next-line @typescript-eslint/no-unused-vars
public delete(_entity: Item) {
throw new Error('Not supported by API');
}
}

demo

如何在 TypeScript(版本 3.7.2)中正确实现它?

最佳答案

您可以使用 never作为实现方法的返回类型。它可以分配给所有其他类型:

interface Item { 
id: number;
}

export class RESTClient<E extends { id: number }> {
public update(entity: E) {
return entity;
}
}

export class ItemClient extends RESTClient<Item> {
public update(entity: Item): never {
throw new Error('Not supported by API');
}
}

来自 documentation 的合适摘录:

The never type is a subtype of, and assignable to, every type; however, no type is a subtype of, or assignable to, never (except never itself). Even any isn’t assignable to never.

关于typescript - 为什么 TypeScript 接受重写方法的正确返回,即使它不可访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59136192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com