问题标签 [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 回答
592 浏览

typescript - 对象的类型保护(不为空)

如何在 TypeScript中获得对象的类型保护?

我对任何输入都有一个检查功能:

但是当我这样使用它时,编译器不会将我的检查变量视为所需的类型:

我究竟做错了什么?

0 投票
1 回答
224 浏览

typescript - 在编写类型保护时,使用 `typeof` 的 `any` 的(正确)惯用替代方法是什么?

  • 由于 TypeScript 3.0在 2018 年年中引入了unknown 顶级类型any,因此不鼓励使用该类型。
  • TypeScript 也长期支持带有typeof运算符的简洁类型保护,但typeof仅作为标量值(即单个变量)的一流类型保护。
    • 主要的警告是它不能与对象属性或数组元素一起使用,除非先使用as anyor as T
      • 使用as any有立即明显的问题。
      • 但是使用as T也引入了它自己的问题。这在类型保护函数中并不是什么大问题,因为带假定类型的变量的范围仅限于类型保护,但如果在普通函数中使用它可能会引入错误。

我目前正在window.error用TypeScript 编写客户端错误处理代码,特别是,我正在ErrorEvent为情况。error

在 TypeScript 中,我们需要编写用作运行时和编译时类型保护的顶级函数。例如,要检查window.error事件监听器是否真的接收到一个ErrorEvent而不是一个,Event我会这样写:

我的问题是关于我打算如何惯用地实现isErrorEventTypeScript 语言设计者想要的方式。我还没有找到关于这个主题的任何权威文档。

具体来说,我不知道我应该如何使用运行时typeof检查来实现isErrorEvent而不使用any对目标类型的类型断言ErrorEvent。据我所知,这两种技术中的任何一种都是必需的,因为 TypeScript 不会让你使用typeof x.y wheny不是x的静态类型的一部分——这让我觉得很奇怪,因为 TypeScript确实让你使用typeof xwhenx任何类型的标量,而不仅仅是它的静态类型。

下面,使用as any作品,但我不喜欢asAny.colno属性取消引用缺乏安全性:

另一种方法是使用as ErrorEvent,但我觉得这同样不安全,因为 TypeScript 然后允许在e 没有事先typeof检查的情况下取消引用 of 的成员!

我想我要问的是如何使这样的事情(见下文)工作,其中 TypeScript 要求typeof在允许任何取消引用之前检查每个成员,并允许e将其静态类型保留为unknown

...但是 TypeScript确实让我们这样做(见下文),这可以说是同一件事,只是在语法上更加冗长:

0 投票
0 回答
46 浏览

typescript - 如何正确缩小 Typescript 中的类型?

我使用的是 GitHub 客户端Octokit 。我正在尝试读取目录的内容,并且返回类型octokit.repos.getContent是具有许多可能值的类型联合。

我试图将返回值缩小getContent到这些选项之一,它看起来像这样:

我从中创建了一个type

现在我正在尝试在类型保护中使用它:

但它说

'DirectoryItems' 仅指一种类型,但在此处用作值。

如何缩小类型data以确保它确实是“内容目录”项的数组?

0 投票
1 回答
70 浏览

typescript - 使用逻辑赋值时如何保持类型保护缩小?

以下是重现该问题的示例:

如您所见,在类型保护之后,curr正确地缩小为R | undefined. 之后,如果它丢失,我将重新分配tmpcurr默认后者为空对象。

现在,如果使用该A || A = B方法,curr逻辑 OR 的左侧将适当缩小为R | undefined. 但是,如果我使用逻辑 OR 分配来使意图更清晰,curr则推断为R | F | undefined. 这显然会导致错误,因为F不可分配给R.

curr问题是 -在第二种情况下失去收窄的原因是什么?

操场

0 投票
0 回答
32 浏览

typescript - 如何检查var是否与打字稿中的接口具有相同的元素?

我想编写一个通用函数,该函数将接口和变量作为输入,以查看变量的名称和数据类型是否与字体的名称和数据类型匹配。或者做类似的事情。但我什么也找不到。我该怎么做?

0 投票
0 回答
17 浏览

typescript - 如何提示该函数检查变量是否未定义?

我有两个验证器功能:

当我开始使用这些函数时,TypeScript 似乎没有检测到isDefined确保变量不能为空/未定义。例如:

如果我手动在线检查:

是否有一些类型可以应用到isDefined函数上,使 TypeScript 明白如果返回 true,传入的变量将始终被定义?

我知道我可以简单地使用该?标志,例如,filters?.page但我宁愿知道是否有更干净的解决方案,而不是必须在整个代码块中不断使用这个标志。

0 投票
1 回答
50 浏览

typescript - 为什么 typescript typeguard 不适用于对象的内部属性

使用打字稿,当函数返回一个具有可能为空属性的对象时。为什么在这些内部属性上使用类型保护不允许打字稿推断内部属性在保护之后不能为空?

这是一个最小的例子。尝试一下

主函数返回的错误是

0 投票
1 回答
109 浏览

typescript - 如何使动态类型可调用(反应自定义挂钩)

假设我有一个自定义钩子,它在数组中返回 3 个东西

并在组件中使用它

现在resetName()或任何重置都是不可调用的,因为那里有 3 种类型,其中 1 种有意义,它不应该string像.useInput() => void

调用时 ts 不想要的确切内容resetName()This expression is not callable. Not all constituents of type 'string | { value: string; onChange: (e: InputChangeEvent) => void; } | (() => void)' are callable. Type 'string' has no call signatures.

我头顶上的一个解决方案是在我执行可调用的操作之前操纵类型并将其缩小为单一类型?还有什么想法吗?

更新

那么进行类型断言是个好主意吗?as我现在可以通过断言 ( )使其工作(() => void)

0 投票
1 回答
28 浏览

typescript - 键入复合类型保护 - 从类型保护推断/继承属性到其调用者

我将两个基本的类型保护功能组合到复合hasWings保护中,但是 TypeScript 并没有推断出它的类型保护特性——它typeof hasWings只是简单地推断出(a: Animal) => boolean. 有没有一种方法可以帮助 TS 推断或明确告诉它hasWingsisInsectisBird类型保护的组合,而无需手动重新指定标准?

0 投票
0 回答
14 浏览

typescript - 带有“扩展”的 Typeguard 不会像预期的那样缩小类型

如何编写一个foo: <A extends Foo|Fooo>(a:A) => AnotherType<A>依赖于代码中的类型保护的通用函数来有条件地映射AAnotherType<A>

我已经尝试过了(从我的实际代码中简化):

现在我正在尝试使用泛型编写一个函数,该函数将采用 Foo|Fooo 并返回 Bar|Barr (但具有正确的类型“映射”:

我认为这个 typeguard 的行为不像预期的那样,因为A extends DomainOne。但是我需要使用泛型,以便我可以指定两个输入之一映射到两个输出之一,而不是任何一个输出类型!

这导致类型(a:Foo|Fooo) => Bar|Barr。非常不是我需要的。我实际上测试了这个