为什么TypeScript不能正确返回重写的方法,即使它无法访问?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么TypeScript不能正确返回重写的方法,即使它无法访问?相关的知识,希望对你有一定的参考价值。
我已经实现了抽象的通用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');
}
}
如何在TypeScript(版本3.7.2
)中正确实现它?
您可以使用never
作为实现方法的返回类型。可分配给其他所有类型:
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类型是每种类型的子类型,并且可以分配给每种类型;但是,没有任何类型是
never
的子类型或可分配给它的(never
本身除外)。甚至never
也无法分配给any
。
以上是关于为什么TypeScript不能正确返回重写的方法,即使它无法访问?的主要内容,如果未能解决你的问题,请参考以下文章
java Iterable接口为啥不能带泛型通配符?或者:为啥我不能重写 iterator() 方法为子类返回一个 Iterator?