问题标签 [narrowing]

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 回答
61 浏览

typescript - 在私有属性上使用 TypeScript 类型谓词

我有一个具有私有可选属性(private foo?: Foo)的类。在类的私有代码中,我需要能够验证此属性是否存在,以便我可以在方法开始时处理一次失败,然后在块的其余部分将其作为非可选处理。

如果 foo是公开的,下面的代码就像一个魅力。但是,由于我需要 foo 是私有的,所以它不起作用。不是验证this是否符合FooBar & FooContainer,而是类型this变为never

这种行为对于我不想让外部代码验证私有属性的存在的公共使用完全有意义。但是,我正在尝试找到一个类似类型谓词的解决方案,我可以在我的班级中私下使用,以使有问题的属性成为非可选的。

0 投票
2 回答
1086 浏览

javascript - 如何为函数类型编写打字稿类型保护方法

我想写 isFunction 方法 - 类似于 isString,但是 typescript/eslint 给了我一个错误:

有没有办法做到这一点?

PS这是答案:

0 投票
0 回答
58 浏览

sql - GraphQl 查询是否可以接受一些 RSQL(或 SQL)来缩小范围?

最近我一直在研究如何使用 GraphQL 查询数据,我想知道是否有可能以某种方式提供适当的参数来缩小给定的查询,比如 RSQL 片段(https://github.com/jirutka/rsql-解析器)?例如,我发现了这样一个查询片段:

所以对我来说似乎是可能的,虽然我不太明白它是如何工作的。有人可以解释如何传递这些参数吗?我会发现它在缩小范围(例如按类型或名称)后搜索数据时很有用。预先感谢您的帮助!

0 投票
1 回答
260 浏览

typescript - 打字稿缩小不适用于嵌套函数的真实性

在共享代码(Playground Link)中编译器抛出错误Object is possibly 'null'.

如果函数中为 null时有提前返回,是否有任何情况可以refresh调用,以便可以为 null ?viewerviewertopLayer

如果不是,在嵌套函数的情况下,打字稿不缩小范围的原因可能是什么?

0 投票
0 回答
22 浏览

typescript - 外推缩小类型

无论如何,是否有简明扼要地表明/承诺一个地方的类型应该与其他地方的另一种类型并行缩小(不必求助于泛型或额外的强制转换)?

例如

0 投票
1 回答
62 浏览

c++ - G++ 引发编译错误而不是警告以缩小转换范围

我想获得编译错误而不是此代码的警告:

如果我编译它:

我没有错误。

但是如果我用以下代码编译相同的代码:

我收到以下警告:

我正在寻找一种方法来获取编译错误而不是仅针对这种特定类型的警告的警告

Obs.1:-Werror可以使所有警告变成错误,但这不是我要找的

Obs.2:我正在使用g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0

0 投票
2 回答
111 浏览

typescript - 使用泛型缩小类型

我想在一个函数中链接 2 个泛型类型,并通过检查其中一个来对这两种类型使用缩小范围。这样做的正确方法是什么?

0 投票
3 回答
610 浏览

typescript - Why doesn't TypeScript narrow array types?

Why is it that TypeScript doesn't narrow the type of arrays?

The workaround is not depending on it narrowing the type by just immediately using or assigning to a fresh variable:

I did try casting, but in hindsight that obviously only works on use, e.g. return input as string[], and will not narrow the type, as .map(...) already returns the correctly narrowed type.

It feels counter intuitive to me having to do these workarounds. Why is it that TypeScript cannot narrow this array type and are there better workarounds available?

I did look into the official documentation and looked at similar questions on Stack Overflow, but unless I have overlooked something, I haven't seen this particular question answered with anything else than just to reassign.

It is what I am doing in my own code for now, but I just wish I knew why it is as it is and if I can do better.

0 投票
1 回答
63 浏览

c++ - 为什么在从 double 转换为 float 时支撑初始化不会引发缩小错误?

每个 C++ 教程很早就提到了两件事:

  1. 在可能的情况下,大括号初始化通常更优越,因为它会在缩小转换期间抛出错误,例如
  1. 您必须将浮点数显式声明为浮点字面量,否则它们将默认为双精度字面量

然而,在 Windows 上使用 g++ 编译器时,我发现了一些奇怪的东西——

此代码编译没有任何错误,并sizeof(narrow)返回 4,其中sizeof(not_narrow)返回 8,如预期的那样。
将鼠标悬停在 1.7 上时,VSCode 将其识别为双字面值 ~=1.699999999999999956,但浮点数随后将其缩小到 ~=1.700000048。
我认为这可能只是 1.7 既可以作为浮点数也可以作为双精度数,所以我尝试了

但这会产生相同的结果。
为什么支撑初始化不在这里抛出错误(警告,诊断消息,任何东西)以将双字面值缩小为浮点数?这是 g++ 特有的,还是一般 C++ 的怪癖?我很想更好地理解。

0 投票
1 回答
29 浏览

typescript - 类型不是使用类型保护从函数中缩小的

我有一个函数,它接受类似结构的参数,并且在函数内部使用类型保护来确定传入参数的类型。

在我的实际应用中,返回了一个不同类型的复杂对象,但在这个例子中,我只是返回了同一个对象。

当我执行该功能

在我的 IDE 中,我可以看到 TSexample在以下块中正确理解了这一点

是正确的类型

(参数)示例:Ex1

您可以看到分配给的对象example是从函数返回的,在这种情况下分配给test

然而,尽管理解了返回块中的正确类型,但 Typscript 并没有将其分配test为 typeEx1而是将其分配为更广泛的 type Ex

这意味着以下会引发错误

类型“Ex”上不存在属性“param1”。

类型保护仅在当前执行块中有用还是我误解了它们的使用?