问题标签 [typeguards]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
134 浏览

typescript - 为什么类型保护不会缩小类型?

我有一些使用类型保护功能的代码:

在以下场景中,类型保护似乎没有坚持:

打字稿报告:

但是,如果我像这样重新排列代码,TypeScript 不会抱怨:

这第二个对我来说有点难以阅读,所以想知道为什么第一个不起作用。有任何想法吗?仍在使用 TypeScript 2.8.3。

0 投票
2 回答
364 浏览

typescript - Typescript Type Guards 和粗箭头函数

这不应该正确编译吗?"Property 'hello' does not exist on type 'object'.我在突出显示的行中收到错误“。

我可以g.hello毫无问题地访问胖箭头功能之外。

0 投票
1 回答
248 浏览

typescript - 打字稿创建带有错误的类型保护

然后像这样使用它:

有什么方法可以帮助打字稿推断正确的类型吗?即要知道如果中间件执行后的代码,它是“记录”?

基本上,目标是不必将 authMiddleware(context) 放入 if 检查中。

0 投票
2 回答
58 浏览

typescript - 如何从类型映射中推断类型

我不知道如何确保onEvent函数的类型安全。

0 投票
2 回答
121 浏览

typescript - 使用未定义的显式返回作为类型保护和/或过滤器?

我正在尝试将数组方法 filter 和 map 组合成一个名为 malter 的函数。我到目前为止:

它基本上有效。但是在使用它时,它会在第 5-7 行抛出一个 TypeError。另一个隐式返回 undefined 的测试函数也抛出了这个错误。

一个有效的解决方案是为 malter 提供 2 个参数。一个过滤器和一个映射函数,并分别调用它们。这将确保类型保存,但也会使其不那么简单。

当然,我可以在第 5-7 行简单地做到这一点:

这可能是最好的妥协?你怎么看?有没有我没有想到的解决方案,或者你会妥协吗?

0 投票
2 回答
211 浏览

typescript - 在错误分支中使用补码的类型保护

我正在尝试使用类型保护来缩小复杂类型的范围。我希望类型保护的错误分支能够理解缩小类型的补充。

这似乎是不可能的,至少不是我打算这样做的方式。Typescript 很高兴推断 aEither可以是模型,但它不接受 aModel可以是Either. 这给出了一个错误:

这个问题是根本无法解决的吗?

如果不是,我如何让错误分支缩小到补码?

请参阅此Typescript Playground中的完整示例

编辑

在这个幼稚的例子中,ModelEither是等价的,但这可能不能一概而论。我可以通过组合两个类型保护来取得一些进展,以试图通知Model实际上是有效的类型系统Either(参见这个新的Playground)。然而,这给我留下了一个不需要的分支(见第 22 行),所以并不完全令人满意。

有没有办法让类型系统知道EitherModel严格等价?

我并不特别需要使用类型保护或联合类型,这是我第一次尝试解决问题,但也产生了自己的问题。只有当我们能够保证一个窄化类型的并集和它的相对补集确实等价于窄化类型时,联合类型才是可行的。这依赖于类型系统对补码的理解,但情况可能还不是这样。请参阅此打字稿补充搜索实用程序类型手册

有人建议使用fp-ts和/或monocle-ts来解决这个问题,但其中一些函数式编程概念仍然让我难以理解。如果有人知道如何在这里应用它们,那会很好。任何一个听起来都可以在这里提供帮助......

0 投票
1 回答
106 浏览

typescript - 如何为泛型类型 List 编写“isX”类型保护不知道 T 的类型?

我正在用 TypeScript 编写一个类型化的 List 实现,作为一个普通对象,它的结构是使用type表达式来确保的。我选择把它写成一个普通对象而不是一个类,因为我相信一个普通对象更容易让我确保它的不变性。该对象的类型定义如下:

我想为这个结构编写一个类型保护,以便我可以确保在其他代码中我正在对一个List对象进行操作。我当前的类型防护如下所示:

这个实现在第一行有一个错误,在list is List:TypeScript 抱怨该类型List<T>是通用的,因此,我必须在对它的引用中提供一个类型。

此函数的预期输出将遵循以下行:

有什么方法可以编写这种类型保护而不必知道 的类型T?如果没有,有没有办法以某种方式检索这种类型,同时仍然允许函数获取任何值?

0 投票
1 回答
611 浏览

typescript - 如何缩小 TypeScript 中构造的泛型类?

0 投票
1 回答
142 浏览

typescript - 通用联合类型的类型保护

我创建了一个联合类型:

我有一个类,它是一个持有该联合类型的键/值对:

然后我可以创建一个 RequestParameter 数组来保存键/值:

我的想法是我可以编写一个GetParameter函数来从该数组返回类型化的值,实际上我可能会像这样使用它:

但是,我的函数获取类型化参数时遇到问题,因为我不知道如何检查泛型类型是否与值类型匹配:

我相信我可能需要编写一个类型保护函数,但我在编写类型保护时以同样的方式努力检查泛型类型。这有可能解决吗?

这是示例:在操场上

0 投票
1 回答
1393 浏览

typescript - TypeScript 中的类型谓词

如果条件逻辑被包装到单独的函数中,这是 TypeScript 中缺少该功能还是经过深思熟虑的 TS 编译器无法推断(然后缩小)参数的类型?我想到的是在这种情况下 TS 编译器给我的错误:

但是,如果我摆脱该函数并在语句isString中内联其逻辑,那么 TS 编译器就会很好地了解该类型。if

我知道我可以使用as string或使用类型谓词来转换类型,并在函数中使用is string类型注释。isString但我刚刚开始思考——为什么TS不能缩小类型了x