我知道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
}
是否有办法确认未知类型的属性是否存在,然后让编译器适当地缩小类型?
答案 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