打字稿换行“函数断言foo是类型”

时间:2020-05-07 14:18:33

标签: typescript assert

让我们创建两个虚拟类和一些示例代码:

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 ...信息:

error

我不想将asserts item is B复制到包装函数。在我的实际用法中,包装函数包装了一个获得参数的函数。

我正在尝试找到与ReturnType<>类似但与asserts类似的东西。

是否可以从给定的函数中检索asserts信息?

谢谢!

Playground

1 个答案:

答案 0 :(得分:0)

不幸的是,您是对的,assertsis是特殊的关键字,当ReturnType<>仅提取类型时,asserts可以帮助打字机解析器理解我们的目标。是void,如果是is,则是boolean

,并且没有明确说明函数assertsvalue is T,无法继承它。

我们的方式-在github上打开一个问题,然后等到https://www.typescriptlang.org/docs/handbook/utility-types.html