typescript - 在 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));
推荐阅读
- python - Visual Studio Code - 缺少图标“在终端中运行 Pyrhon 文件”
- asp.net - 发布 Devexpress dll
- python-3.x - 使用 python 和 django 框架工作问题
- objective-c - Swift 代码不能使用继承自 Swift 类的 Obj-C 类?
- css - 如何保持与图像的比例?
- c# - 如何通过 C# 应用程序在文件级别授予 Windows 权限?
- ruby-on-rails - 根据格式路由到不同的操作
- javascript - 字符串化一些 obj 并使浏览器崩溃
- python - tf.keras.backend.clear_session 实际上做了什么?
- java - 提供在服务器中生成并存储在内存中的 zip 文件