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

如何在typescript中检查运行时的对象类型?

卫阳曜
2023-03-14

我试图找到一种方法来传递一个对象来发挥作用,并在运行库中检查它的类型。这是一个伪代码:

js prettyprint-override">function func (obj:any) {
    if(typeof obj === "A") {
        // do something
    } else if(typeof obj === "B") {
        //do something else
    }
}

let a:A;
let b:B;
func(a);

但是typeof总是返回“object”,我无法找到获取aB的真正类型的方法。instanceof也不起作用,返回了相同的内容。

共有1个答案

祁刚毅
2023-03-14

编辑:我想向通过搜索来到这里的人指出,这个问题专门涉及非类类型,即由接口类型别名定义的对象形状。对于类类型,可以使用JavaScript的instanceof来确定实例来自的类,TypeScript将自动在类型检查器中缩小类型。

类型在编译时被剥离,并且在运行时不存在,因此无法在运行时检查类型。

您可以做的是检查对象的形状是否符合您的期望,并且TypeScript可以在编译时使用返回true(注释的返回类型是arg is t形式的“类型谓词”)的用户定义的类型保护来断言该类型:

interface A {
  foo: string;
}

interface B {
  bar: number;
}

function isA(obj: any): obj is A {
  return obj.foo !== undefined 
}

function isB(obj: any): obj is B {
  return obj.bar !== undefined 
}

function func(obj: any) {
  if (isA(obj)) {
    // In this block 'obj' is narrowed to type 'A'
    obj.foo;
  }
  else if (isB(obj)) {
    // In this block 'obj' is narrowed to type 'B'
    obj.bar;
  }
}

类型保护实现的深度取决于您,它只需要返回true或false。例如,正如Carl在他的回答中指出的那样,上面的示例只检查是否定义了预期的属性(按照文档中的示例),而不检查是否为它们分配了预期的类型。对于可空类型和嵌套对象,这可能会变得很棘手,这取决于您确定如何详细检查形状。

 类似资料:
  • 本文向大家介绍TypeScript 运行时类型检查补充工具,包括了TypeScript 运行时类型检查补充工具的使用技巧和注意事项,需要的朋友参考一下 TypeScript是静态类型系统,在编译时做类型检查。一般而言,如果项目所用到的所有库、模块都是基于ts的,那么静态类型已经可以避免大部分编程层面的类型问题。不过,在一些场景下来,单纯静态类型是无法解决问题的,部分数据是动态传入到系统中的,主要包

  • Example Module # example.py # This comment appears first # and spans 2 lines. # This comment does not show up in the output of getcomments(). """Sample file to serve as the basis for inspect example

  • 问题内容: 我在运行时加载JSON配置文件,并使用接口定义其预期结构: 由于可以使用自动填充等功能,因此可以方便地访问各种属性。 问题: 有没有一种方法可以使用此声明来检查我加载的文件的正确性? 即我没有意外的属性? 问题答案: 没有。 当前,类型仅在开发和编译期间使用。类型信息不会以任何方式转换为已编译的JavaScript代码。

  • 问题:有没有一种方法可以使用这个声明来检查我加载的文件的正确性?我没有意外的财产?

  • 你能告诉我如何在typescript+angular中检查变量的类型吗?

  • 问题内容: 我有一个接受PDO对象作为参数的方法,以允许用户使用现有连接,而不是该方法打开一个新连接并节省资源: 我知道要检查参数是否为对象,但我想检查是否为PDO对象,而不仅仅是对象。 因为用户可以轻松输入(错误地输入?)另一种对象(一个mysqli或类似的对象),并且整个脚本会破裂。 简而言之:如何检查特定类型对象的变量? 问题答案: 您可以使用: 但是请注意,您不能像否定,所以您应该这样做: