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

typescript - 使用动态字符串为允许的枚举值键入保护?

我正在处理来自第 3 方的一些数据,我想通过 id 将其转换为地图,但前提是数据有效。我有一个允许属性的枚举,但无法弄清楚如何以编译器允许的方式检查数据是否有效。我试图在枚举上使用带有 in 运算符的 if 语句进行检查:

尝试分配action抛出此错误:Type 'string' is not assignable to type 'Actions'.

0 投票
1 回答
806 浏览

typescript - 允许多个不同形状的接口作为 TypeScript 返回类型

我有一个函数,它接受一些参数并生成将传递给外部进程的对象。因为我无法控制最终需要创建的形状,我必须能够为我的函数获取一些不同的参数并将它们组装成适当的对象。这是一个非常基本的示例,展示了我遇到的问题:

这个特定的函数抱怨“type1”不能分配给“type2”。我读了一些关于类型保护的文章,并想出了如何让这个简单的例子变得快乐:

但是,我不明白为什么这是必要的。类型检查对返回值的可能性完全没有任何作用。基于我的参数仅采用两个显式字符串之一的事实,单个 return 语句保证返回 T1A 或 T2A 之一。在我的实际用例中,我有更多类型和参数,但我分配它们的方式总是保证至少返回一个指定的接口。在处理接口时,似乎联合并不是真正的“这个或这个”。我试图分解我的代码来处理每个单独的类型,但是当有 8 种不同的可能性时,我最终会得到很多看起来无用的额外 if/else 块。

我也尝试过使用类型type T1A = {...};

我是否对工会有误解,或者这是一个错误,还是一种更简单的处理方法?

0 投票
0 回答
62 浏览

typescript - 将布尔构造函数转换为类型保护

Boolean在数组中使用构造函数.filter(/* ... */)来过滤掉虚假值是一种常见的模式。

无论如何我可以将Boolean构造函数转换为删除可空值的类型保护吗?我正在尝试执行以下操作:

但我收到以下错误:

有任何想法吗?

游乐场链接

0 投票
1 回答
78 浏览

typescript - TS型复合型防护装置

我遇到了一个 TS 类型守卫的有趣行为,想问一下我是否必须接受它,或者我是否做错了什么。我把最小的例子放在一起(嗯,接近最小)。

TS游乐场

为什么需要添加:Leg[]?是否可以重写代码,以便 TS 自己了解正确的类型是什么?

0 投票
1 回答
373 浏览

typescript - 如何对过滤 Object.entries 进行类型保护?

我希望有类似这样entryof的类型保护条目:

如何使用 typeguard 解决这个问题?

0 投票
1 回答
47 浏览

typescript - 在 Typescript 中测试与文字相等或与 typeof 相等时,类型保护不适用

在下面的代码中,当我期望它具有 type 时,在该ifvalue中推断它具有 type 。anyundefined | string

如果我用 替换value === undefined测试typeof value === 'undefined',我会得到预期的类型推断:

流分析是否不能处理基于文字检查的类型保护和基于typeof检查的类型保护?

我正在使用 Typescript v3.8.3。该行为可以在 Typescript playground 上看到。

0 投票
0 回答
30 浏览

typescript - 在 Typescript 中,为什么针对文字值的相等性测试不会缩小任何类型?

在 Typescript 中,测试变量和文字之间的相等性会将变量的类型缩小到文字类型。

但是,如果值为 type any,则不会缩小类型。

为什么针对文字值的测试不能缩小any类型?

如果发生缩小确实会发生

  • value是类型unknown
  • 带有类型保护的函数is 42被显式定义并用作条件
  • 该测试typeof基于

该问题发生在 Typescript 3.8.3 上,可以在 Typescript Playground 上重现。

0 投票
1 回答
505 浏览

typescript - 在打字稿中返回`payload is T`时如何推断正确的类型?

我有一个类型保护检查函数,它告诉 JavaScript 一个值是否是一个承诺,同时它告诉 TypeScript 该变量是一个承诺:

它工作得非常好,但是,我意识到我不需要硬编码 promise 解析为any而是推断该类型。

这是我看到any它不能正常工作的一个例子:

在此示例中,b推断为PlainObjectwhile 它应该是PlainObject | PlainObject[]....

问题一:为什么会这样?

我尝试的更好isPromise功能的解决方案:

从理论上讲,我不明白为什么这不起作用。但我得到这个错误:

类型谓词的类型必须可分配给其参数的类型。类型“Promise>”不可分配给类型“T”。“Promise>”可分配给“T”类型的约束,但“T”可以用约束“any”的不同子类型来实例化

问题2:为什么不起作用payload is Promise<Unpacked<T>>,否则我怎么能推断出这个?

以下是 TypeScript PlayGround 中的所有内容:

https://www.typescriptlang.org/v2/en/play?#code/KYDwDg9gTgLgBDAnmYcAKAbAhgSwHYDyARgFbADG8AvHAN5wDaA1sIgFxwDOMU+A5gF0OWPIjgBfAFCSAZgFc8lHBDxw+wGABVkqABRgsiDBCwATYaICUHbrzx86kuHCga5UVcTKUAdGCgQMIE6PkEAyjz8PuRYGBj6hsZmlj6cGDjkwLoAHAA0cAC0AIyWkuLOztLyijDKqjicaAEAtg16BkYm5nAiiNZwHUmmcA3oLW0APL0AfI7OrjDuqupaOgmdyXBU23AA5E0QrZzAu2XSGBo9HJi4hKQU8AA+6Nj4Xg8MAnDPB0fAEzc3vdKN8Xrd3pRPtNJBd4EQtiNGuNjrosJY4AB+HoAd1w8CwcGE0gA9MS4NiABZYeAASRcwFiGDEuLw8CCcFMEERbEkSBQcAAqngDOQWKYJppZlQnBVNHBQDBgHhTJw4Lp8DJgFBBZZPpjBYSZc45QqlSq1T5LVgoHxOBZEJ90VRZhqtQasQLDRU4CaQIrlarfpNXdqBbMPV7ZQBuKoKJQqRFB44AJjgEvlfrNqpm6yGHE0-UGXURY0OkyFIrFEums1oMoWSzUGm0KFzXSdO32yJOZyAA

0 投票
1 回答
26 浏览

reactjs - 通过传递的密钥访问通用数据

我有通用组件(具有以下类型):

您应该能够像在示例中一样使用它:

我应该能够data作为 Array 传递,并且searchKey好像 T 是对象、它的键或只是一个类型。

但是当我尝试做类似的事情时

我收到了一个 TS 错误。

我尝试了类似的东西

但它不起作用。

有任何想法吗?

0 投票
1 回答
2727 浏览

typescript - 为什么无效的合并运算符在打字稿中不能用作类型保护?

Typescript 3.7 引入了nullish 合并运算符。对于像这样的情况,它似乎是完美的类型保护

但是,如果您将该代码放入typescript playground,它会提醒您传递给 fs / fn 函数的 a 和 b 参数,例如:

'string | 类型的参数  空 |  undefined' 不可分配给参数 fo type 'string' 我进行了进一步的实验,发现这不仅是一个孤立于无效合并运算符的问题,而且当 typescript 能够使用 soemthing 作为 typeguard 时,我无法改变主意(在下面你可以找到一些示例

最后两行最让我困惑。在我看来,分配给 x7 和 x8 的两个表达式都是完全等价的,但是在分配给 x8 的表达式中,类型保护工作,对于 x7 表达式中的打字稿来说似乎并不合适:

我不确定,如果打字稿由于某种原因无法应用类型保护,或者它实际上是打字稿中的错误。那么,当 typescript 可以应用 typeguard 时,是否有规则手册?或者它可能是一个错误?还是有其他原因我没有编译这些示例?

顺便提一句。当使用用户定义的类型保护时,当然可以完美地工作,但最好不必添加一些运行时代码来使类型保护工作。