当前位置: 首页 > 知识库问答 >
问题:

检查变量是否为typescript联合中的特定接口类型

徐峰
2023-03-14

是否有可能创建一个typeGuard,或者其他实现相同目的的东西,来检查一个变量是否是打字稿联合中的特定接口类型?

interface Foo { a:string }
interface Bar { b:string }

(function() {
    function doStuff(thing: Foo | Bar) {
        if(typeof thing === 'Foo') {
            console.log('Foo');
        } 
        else if (typeof thing === 'Bar') {
            console.log('Bar');
        }
        else {
            console.log('unknown');
        }
    }

    var thing: Foo = {a:'a'};
    doStuff(thing);
})();

共有3个答案

吕宇定
2023-03-14

在TypeScript 2中,您可以使用如下区别联合:

interface Foo {
    kind: "foo";
    a:string;
}
interface Bar {
    kind: "bar";
    b:string;
}
type FooBar = Foo | Bar;
let thing: FooBar;

然后使用if(thing.kind==="foo")测试对象。

如果您只有两个字段,如示例中所示,我可能会使用@ryan cavanaugh提到的组合接口,并使这两个属性都是可选的:

interface FooBar {
    a?: string;
    b?: string
}

请注意,在原始示例中,使用if(thing.a!==undefined)测试对象会产生错误类型“Foo | Bar”上不存在属性“a”

使用if(thing.hasOwnProperty('a'))测试它不会在if语句中将类型缩小为Foo

@ryan cavanaugh在TypesScript 2.0或2.1中有更好的方法吗?

戚学
2023-03-14

typeof不这样做。它总是返回“字符串”、“数字”、“布尔”、“对象”、“函数”或“未定义”。

您可以使用类似的测试来测试对象属性if(事情. a!==未定义){if(thing.hasOwnProperty('')) {

请注意,您可以创建一个同时具有字符串a字符串b的对象,因此请注意这种可能性。

乔鸿骞
2023-03-14

自TypeScript 1.6以来,您可以使用用户定义的类型防护:

let isFoo = (object: Foo| Bar): object is Foo => {
    return "a" in object;
}

看https://www.typescriptlang.org/docs/handbook/advanced-types.html#user-defined-type-guardshttps://github.com/microsoft/TypeScript/issues/10485

 类似资料:
  • 我在TypeScript中使用一个接口来定义一个函数,该函数仅在扩展基类的一些类上可用。这是我到目前为止的代码的简化版本: 现在,问题是我会添加更多的“行走”动物,这样移动动物的功能就会变得太大而无法控制。我想做的事情是这样的: 但是,“implements”检查不起作用,在使用接口时,我找不到与“instanceof”等效的。在Java中,“instanceof”的使用似乎可以在这里使用,但Ty

  • 问题内容: 我想知道如何检查变量是否是类(不是实例!)。 我试图使用该函数来执行此操作,但我不知道类将具有哪种类型。 例如,在以下代码中 我试图用 ??? 代替“ ” ,但我意识到这是python中的关键字。 问题答案: 更好的是:使用该功能。

  • 问题 你希望检查一个变量是否为一个数组。 myArray = [] console.log typeof myArray // outputs 'object' “typeof” 运算符为数组输出了一个错误的结果。 解决方案 使用下面的代码: typeIsArray = Array.isArray || ( value ) -> return {}.toString.call( value ) i

  • 我正在尝试实现这样一个方法,它接受一个关键参数,该参数要么是要么是可索引类型接口的实例。实现如下所示: Typescript给出块的以下错误: [ts]“IValidationContextIndex”仅引用类型,但在此处用作值。 有什么办法解决这个问题吗? 对于大多数接口,我认为可以添加属性(;),但这在本例中不起作用,因为该接口是可索引类型的接口....

  • 问题内容: 假设我有任何变量,定义如下: 我想要一个检查变量类型是否像函数一样的函数。即: 如何检查变量是否为上述定义的类型? 问题答案: 当然,下划线的方式效率更高,但是当效率不是问题时,最好的检查方法是写在@Paul Rosania链接的下划线页面上。 受下划线启发,最终的isFunction函数如下:

  • 问题内容: 我正在使用反射来查看附加到类的属性的注释是否具有特定类型。目前我正在做: 这让我有些不高兴,因为它依赖于完全合格的类名称的字符串。如果将来更改命名空间,则可能会导致细微的错误。 我想要做: 但是是抽象类,无法实例化。有没有一种方法可以针对接口或抽象类进行模拟(或基本上使用)? 问题答案: 你只是在寻找 ?