类型守卫检查财产是否存在

时间:2019-01-03 21:27:59

标签: typescript

我知道type guards可用于区分联合类型。但是是否可以检测传入的未知类型的属性?

此代码无效。

function foo(bar: unknown | { createdDate: Date }) {
    if (bar.createdDate)
        alert(bar.createdDate); //Doesn't work
}

这也不是:

function foo(bar: unknown | { createdDate: Date }) {
    if ('createdDate' in bar)
        alert(bar.createdDate); //Doesn't work
}

注意:将bar的类型更改为any确实可以,但是编译器并未缩小if语句内的类型。它以bar.createdDate的形式输入any

我也尝试使用此功能的通用版本。

function foo<T extends (unknown | { createdDate: Date })>(bar: T) {
    if ('createdDate' in bar)
        alert(bar.createdDate); //Doesn't work
}

是否有办法确认未知类型的属性是否存在,然后让编译器适当地缩小类型?

1 个答案:

答案 0 :(得分:2)

在工会$result中,“吃掉”任何其他成员,因此unknown(此行为在in the PR中进行了描述)

也可以通过PR缩小unknown | { createdDate: Date } == unknown的范围:

unknown

使用自定义类型防护似乎是获得所需结果的唯一方法(因为function f20(x: unknown) { if (typeof x === "string" || typeof x === "number") { x; // string | number } if (x instanceof Error) { x; // Error } if (isFunction(x)) { x; // Function } } instanceof`不适用于接口)

typeof x === "typename" is not applicable and

或者您可以使用function foo(bar: unknown) { const hasCreatedDate = (u: any): u is { createdDate: Date } => "createdDate" in u; if (hasCreatedDate(bar)) { alert(bar.createdDate); } } 来吃掉其他工会会员

Object