让我们创建两个虚拟类和一些示例代码:
class A {
constructor() {}
}
class B extends A {
value: number;
constructor(value: number) {
super();
this.value = value;
}
}
const values: A[] = [new A(), new A(), new B(123)];
const oneOfThem = values[2];
validateB(oneOfThem);
console.log(oneOfThem.value);
function validateB(item: A): asserts item is B {
if (!(item instanceof B)) {
throw new Error('wrong type!');
}
}这段代码运行得很完美。
问题是,我需要用另一个函数包装validateB:
function validateBWrapper(item: A) {
return validateB(item);
}但是,当我在上面的代码中使用这个函数而不是validateB时,它就失去了asserts ...信息:

我不想把asserts item is B 复制到包装器函数中,在实际使用中,包装函数包装一个函数,它得到一个参数。
我正在尝试找到类似于ReturnType<>的东西,但使用asserts。
有没有任何方法从给定的函数中检索asserts信息?
谢谢!
发布于 2020-05-07 14:45:13
不幸的是,您是对的,asserts和is是特殊的关键字,它们帮助类型记录解析器理解我们的目标--当ReturnType<>只提取一个类型时,如果是asserts,则是void,而对于is,则是boolean。
而且,无需明确说明函数asserts或value is T,就无法继承它。
我们的方式-打开github上的一个问题,然后等到他们在这里为它添加一个新的实用程序类型( https://www.typescriptlang.org/docs/handbook/utility-types.html )
https://stackoverflow.com/questions/61660137
复制相似问题