我试图找到一种方法,将一个对象传递到函数中,并在运行时判断它的类型.这是一个伪代码:

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也不起作用,但返回了相同的结果.

你知道怎么用打字脚本吗?

推荐答案

Edit:我想向通过搜索来到这里的人指出,这个问题专门针对非类类型,即对象

类型在编译时被剥离,在运行时不存在,因此不能在运行时判断类型.

您可以做的是判断对象的形状是否符合预期,如果形状符合预期,TypeScript可以在编译时使用返回true的user-defined type guard(带注释的返回类型是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;
  }
}

Example in Playground

类型保护实现的深度取决于您,它只需要返回true或false.例如,正如Carl在回答中指出的那样,上面的示例只判断预期属性是否已定义(遵循文档中的示例),而不是它们是否被分配了预期类型.对于可为空的类型和嵌套对象,这可能会很棘手,由您决定进行形状判断的详细程度.

Typescript相关问答推荐

Angular 垫页分类和垫排序不起作用

在TypScript手册中可以视为接口类型是什么意思?

如何根据另一个属性的布尔值来缩小函数属性的返回类型?

编剧错误:正在等待Expect(Locator).toBeVisible()

在不更改类型签名的情况下在数组并集上映射文字

返回具有递归属性的泛型类型的泛型函数

扩展参数必须具有元组类型或传递给REST参数

类型TTextKey不能用于索引类型 ;TOption

迭代通过具有泛型值的映射类型记录

使用数组作为类型中允许的键的列表

在排版修饰器中推断方法响应类型

从子类集合实例化类,同时保持对Typescript中静态成员的访问

返回嵌套props 的可变元组

推断集合访问器类型

如何从JWT Reaction中提取特定值

Route.ts文件中未导出HTTP方法

T的typeof键的Typescript定义

如何向我的自定义样式组件声明 custom.d.ts ?

在Typescript 无法正常工作的 Three.js 中更新动画中的 GLSL 统一变量

剧作家测试未加载本地网址