如何解决在 Typescript 中使用类型保护时推断类型
interface A = {
name: string;
...
};
interface B = {
name: string;
...
};
interface C = {
key: string;
...
};
type UnionOfTypes = A | B | C | ...;
function hasName(item: UnionOfTypes) {
if ("name" in item) {
item; // typescript kNows here that item is either A or B
}
}
有什么方法可以像 if("name" in item)
那样推断类型吗?我没有类只有接口/类型。
这样我就不必明确说
function hasName(item: UnionOfTypes): item is A | B {
...
}
这背后的原因是我想更深入地使用其他类型保护,或者还有其他原因为什么我应该避免以这种方式缩小类型?
解决方法
默认情况下,打字稿不支持此功能。您可以创建一个辅助函数来创建类型保护。传递给此辅助函数的函数将返回受保护的项目,或 false
。
function guard<T extends I,I>(fn: (value: I) => T | false) {
return function (value: I) : value is T {
return fn(value) !== false
}
}
interface A {
name: string;
a: number;
};
interface B {
name: string;
b: number;
};
interface C {
key: string;
};
type UnionOfTypes = A | B | C ;
const hasName = guard(function (item: UnionOfTypes) {
if ("name" in item) {
return item;
}
return false;
})
// Works for other casses too
let numberOrNull: Array<string | null> = ["",null]
let r = numberOrNull.filter(guard(v => v ?? false));
let r2 = numberOrNull.filter(guard(v => v ?? false));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。