让我们创建两个虚拟类和一些示例代码:
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
信息?
谢谢!
答案 0 :(得分:0)
不幸的是,您是对的,asserts
和is
是特殊的关键字,当ReturnType<>
仅提取类型时,asserts
可以帮助打字机解析器理解我们的目标。是void
,如果是is
,则是boolean
。
,并且没有明确说明函数asserts
或value is T
,无法继承它。
我们的方式-在github上打开一个问题,然后等到https://www.typescriptlang.org/docs/handbook/utility-types.html