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

typescript - Typescript - 键/属性类型保护

我可以创建一个 typeguard 来断言对象中存在(或具有特定类型)的特定属性。

IE

我有一个界面Foo

现在一个类型的对象Foo将有一个可选的属性buzz。我将如何编写一个断言存在嗡嗡声的函数:即

我将如何实施hasBuzz()?类似于打字机的东西:

这样的事情存在吗?

PS:我知道我可以这样做:

但是我的实际用例要求我有一个单独的函数来断言buzz.

0 投票
1 回答
64 浏览

typescript - 试图在 UnityTiny 中对我的自定义事件系统进行类型保护

我在 Unity Tiny 中创建了一个事件系统,因为框架本身的事件系统非常有限。我让它工作了,但现在我想让它对我的同事更友好。所以我尝试对它进行类型保护以防止用户使用不同的类型,但它似乎对我不起作用。有什么建议么?

我已经看过这些: - https://medium.com/ovrsea/checking-the-type-of-an-object-in-typescript-the-type-guards-24d98d9119b0 - https://dev.to/krumpet /generic-type-guard-in-typescript-258l

问题是unity tiny正在使用es5。所以你无法通过 object.constructor.name 来获取类型的名称。因此使用“instanceof”是不可能的。

此外, (object as T) 不起作用,我也无法获得 (object as T).type。

0 投票
0 回答
671 浏览

typescript - 断言所有剩余参数的类型保护不是未定义的

是否可以创建一个用户定义的类型保护,让编译器知道传递给它的所有参数都已定义?

我想做这样的事情:

我想使用它,以便我可以传递一组可能未定义的参数,处理未定义时会发生的情况,否则将它们传递给需要未定义值的方法。

这可能看起来像这样:

当我尝试上面的幼稚版本时,编译器告诉我:

类型谓词不能引用休息参数

所以,我目前假设它无法完成。但是,我想在放弃之前我会问。

谢谢!

0 投票
0 回答
70 浏览

typescript - 只读值上的类型保护

我正在尝试添加一个类型保护来区分对 API 的成功和失败调用,其中响应共享相同的顶级格式:

我希望这能奏效,但它没有......

是否可以在属性值上添加类型保护?如果值可以改变,我可以看到这个问题,但如果它是只读的,它似乎应该没问题。

更新

看起来也许我只是把我的类型保护功能弄错了。这是一个游乐场链接,它按预期工作。

0 投票
1 回答
151 浏览

typescript - TypeScript:将实例传递给函数时实现不起作用

我有一个TypeScript interface定义事件发射器

这基本上意味着如果我Emitter<A>像这样输入一个类型:

这个

确保我只能对and函数使用"discover"+(peripheral: Peripheral) => void"service"+的组合。像这样:(service: Service) => voidonoff

这行得通。现在我有第二个类,它期望实现Emitter<any>

我有一个我这样使用Emitter<Api>implements实现

现在,当我尝试将实例传递ObjectManagerWatcher类时,出现类型错误:

但是我可以这样做:

哪个有效。

现在我想知道怎么了。我可能用implements错了吗?

0 投票
1 回答
301 浏览

typescript - TypeScript 类型谓词可以分配给变量吗

考虑TypeScript 文档中这样的类型谓词:

我有一些这样的代码:

我想isFish通过将结果分配给一个变量然后检查它来避免调用两次。像这样的东西:

但是,TypeScript 编译器不喜欢这样,因为对 的检查isAFish不能作为对pet. 我试过给出, 和isAFish的类型,但看起来类型谓词不能用作这样的变量的类型。(pet is Fish)(typeof(pet) is Fish)

我的印象是没有办法避免在这里重复调用类型保护函数,但我在网上没有找到太多关于这个的信息,所以无论哪种方式都希望得到确认。

0 投票
1 回答
171 浏览

typescript - 打字稿,类型保护在异步函数中无法正常工作?

我正在尝试使用 typescript 和 firebase/store 为用户角色实现身份验证函数,并且在异步函数中使用类型保护时注意到一些奇怪的事情。具体与.then().

以下是有问题的代码片段(为简洁起见,断章取义):

打字稿编译器抱怨在 authUser = { uid: authuser.uid ... }块中,authUser可能是null. 当它在if声明中时,这怎么可能?这与函数是异步的事实有关吗?

0 投票
1 回答
2471 浏览

typescript - 为具有所有可选属性的接口创建类型保护

我有一个函数makeMergedState,它接受一个对象或一个类型的数组ICustomState

这些函数包含条件语句,具体取决于输入是有效的 ICustomState 还是 ICustomState[]。如果输入是错误类型转换的无效对象,我希望函数抛出。

这是我想要成功的测试用例:

ICustomState 是一个仅包含可选属性的 TypeScript 接口。我可以用这样的函数输入保护数组: const isCustomStateArray = (p: any): p is ICustomState[] => !!p[0];

但是,我找不到制作等效isCustomState类型保护的方法,我认为这是类型保护如何与类型系统一起工作的限制。

根据this GitHub issue,可以使用标签类型解决此限制,但我不确定如何。

非常感谢任何建议。

编辑:Codesandbox 示例

0 投票
1 回答
1376 浏览

typescript - Typescript 用户定义的类型保护检查对象具有数组中的所有属性

我正在尝试编写一个用户定义的类型保护来测试它给出的值是否具有给定数组中的所有属性。

我正在调用这个函数hasAll,它在 Javascript 中的实现和使用如下所示:


我现在要做的就是把上面的函数变成一个type guard。这是我到目前为止所拥有的:

游乐场链接


错误信息是:

我已经阅读了这个答案并给出了很好的解释,但它并没有真正帮助我的情况。

我想明确断言我的类型在运行此函数T后将符合。RemoveNullables<NonNullable<T>, K>我真的不在乎是否T可以分配给RemoveNullables<NonNullable<T>, K>(如果有意义的话)。


  1. 我要解决这个问题了吗?有没有更好的方法来编写这种类型保护?
  2. 如果这种方法很好,我怎么能告诉打字稿我不在乎类型保护本身是否“不安全”?
0 投票
1 回答
172 浏览

angular - 任何 [] 函数参数的打字稿类型保护

想知道让这个类型保护实例对这样的函数进行检查是否有意义:

由于参数已被声明为任何数组,这是否自动暗示运行时值应该始终是数组的实例?

这是涉及任何特定情况并且类型保护是必要的吗?

我的意思是:指定参数的类型是否确保运行时该参数在开发人员工具中显示为该类型?在这种情况下,该类型的实例表示无用的检查..