问题标签 [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 投票
2 回答
134 浏览

angular - 如何获取多个联合接口类型的属性的值?

我有以下代码:

它给了我1个错误:"The map expression is not callable"

如果我错了,请纠正我,但我认为这是因为它不知道id联合中的所有接口中都有一个名为的属性。


我以前使用过类型保护,但我认为您只能在联合中的两种类型之间创建类型保护,因为您必须返回一个布尔值?

我想用 typescript(用户定义的类型保护、typeof、instanceof 等)解决这个问题,但我不确定这是否可行,不是吗?instanceof不能为接口创建类型保护,对吧?
这里有什么好的解决方案?


编辑:我刚刚解决了一个接口的问题,该接口具有联合中的接口共有的属性,我只是用新接口更改了联合类型。这不是很好的解决方案,因为我想在类型联合中拥有的不同接口中使用特定的方法/属性。

所以我不会删除这个问题,因为了解是否存在用于类型联合的用户定义类型保护(其中包含超过 2 种类型)之类的东西仍然很有帮助。

0 投票
2 回答
41 浏览

typescript - 为什么我的 TypeScript 报告联合类型的错误?

我有:

在哪里:

我正在努力:

但我得到的错误是:

我以为这guard会起作用,但事实并非如此。

0 投票
1 回答
4623 浏览

javascript - 确定打字稿中可能有多种类型的参数类型

给定一个具有不同类型参数的函数,我如何找出传递给函数的类型?

例子

我知道有类型警卫,但我对那些有顾虑

  1. 他们需要能够唯一地识别每种类型。我看到有些人添加了一个属性kind,或者type它允许他们识别一种类型以进行类型保护。不过,这对我来说似乎是很多开销和样板。

  2. 您需要为每种类型编写一个自定义函数,type is A或者type is B在我的上下文中再次导致大量开销。

在打字稿中处理这个问题的适当方法是什么?

0 投票
1 回答
504 浏览

typescript - 如何将扩展类型保护添加到条件类型?或同等学历

假设我有一个带有泛型参数的类。它对某些类的属性具有条件类型。这些条件类型取决于作为两个可能枚举值之一的泛型参数。在构造函数中,我传递了一个与泛型参数遵循相同类型边界的类型。我期望的是检查login_type === TwoChoices.REGISTER缩小类的泛型参数的类型T,但是这不会发生。这是示例。

打字稿游乐场链接

上面抛出一个TypeError: Type '""' is not assignable to type '(T extends TwoChoices.REGISTER ? string : never) | undefined'.

我希望能够编写的只是添加一个类型保护,其中 aC extends TwoChoices.REGISTER作为函数返回类型,如下所示:

打字稿游乐场链接

但是,它似乎X extends Y不是有效的类型保护返回类型。

静态类型这些 JavaScript 的动态类型场景的正确、更好的方法是什么?

您可能会建议像这样使用类继承:

打字稿游乐场链接

但在我看来,不得不改变我编码类型的方式似乎与我对 TypeScript 的哲学的理解不相符你编写 JavaScript 代码。const enum与类继承方法相比,在转译为 ≤<code>es5 时,使用类也会使行数加倍,尤其是在第一个代码块中使用s 时。

0 投票
1 回答
118 浏览

typescript - TypeScript:自定义类型的类型保护

目标:尝试为自定义类型创建类型保护。

这是我的自定义类型:

这是我第一次尝试创建type guard,但这在两次声明允许值时似乎是多余的:

有没有更好的方法来为自定义文字类型做类型保护?

谢谢

0 投票
1 回答
266 浏览

javascript - Typescript - 在另一个对象中检索一个对象

我想从 main_object 集合中检索对象“rename_fields”以使用其字段值:

但我有错误:

test_object_loop.js:50
Object.keys(keyConfiguration[keyPluginConfiguration]).forEach(function (keyRenameFields) { ^
TypeError:Cannot convert undefined or null to object
at Function.keys ()
at test_object_loop.js:50:28
at Array.forEach ()
at test_object_loop.js:47:56
at Array.forEach ()
at test_object_loop.js:44:30
at Array.forEach ()
at Object. (test_object_loop.js:42:26)
at Module._compile (internal/modules /cjs/loader.js:1137:30)
在 Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10)

如何在具有特定类型的另一个对象中检索对象?

0 投票
1 回答
165 浏览

typescript - 消除未定义的警告?来自 Object.entries 遍历的值应该是保证字符串

我已成功让我的代码编译并运行良好,但我的 Typescript 编辑器仍在Playground Linkval的第 57 行报告警告

我无法理解如何消除警告。任何人都可以看到一个明显的变化,它会给出所需的缩小范围吗?

根据此类型规范,我认为 searchInvocation 的keyval解构必须分别是 SearchField 和字符串...

错误报告为...

...但我不知道它怎么可能是未定义的。

也许它警告我 Object 可能符合 SearchInvocation 类型的形状,但其他(非托管)键值对可能已添加到顶部,并且它们的内容是未知的。

但是,我没有从 ProxyInvocation 类型中遍历 Object.entries() 得到等效的警告,它看起来有些等效,但必须隐式保护。

如果非托管键是问题的根源,我不知道如何添加运行时防护,它将我正在遍历的键过滤为仅由 SearchInvocation 类型管理的键。我认为这将涉及在 javascript 运行时读取 SearchField 中列出的字符串文字的联合,以过滤掉其他文字。或者也许我可以对 SearchInvocation 类型施加进一步的限制,以从不接受不是来自 SearchField 的键。

0 投票
2 回答
322 浏览

typescript - 如何在打字稿中动态声明类型保护?

我想动态设置类型保护取决于数组元素

在打字稿中研究策略模式。这是代码

假设策略是这样添加的:

然后;

strategy使用 sm.getStrategy. 我需要name类型的参数'foo' | 'bar'

因此智能感知会抛出如下错误:

0 投票
1 回答
334 浏览

typescript - 如何通过布尔值输入守卫?

我有以下内容:

理想情况下,返回的类型为: { isSuccess: true, resultExample: string} | { isSuccess: false },但它的类型为{ isSuccess: boolean, resultExample: string } | { isSuccess: boolean },这令人沮丧,因为这意味着我无法利用类型保护。

上面不应该出错,因为 true 和 false 应该被用作类型保护,而是它们被键入为布尔值。

我唯一的解决方案是手动将它们键入真假吗?

0 投票
1 回答
78 浏览

typescript - Typeguard 不会缩小类型

我正在创建一个对象来存储一堆 RGB 颜色,并且允许嵌套。所以在循环对象时,我需要查看哪些键对应于 RGB 值或对象。但是,我尝试过的每个类型保护器实际上都不会缩小类型的范围。

游乐场链接

有任何想法吗?我只是错过了一些关于类型保护的基本知识吗?