Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Typescript中检查自定义接口类型_Javascript_Typescript - Fatal编程技术网

Javascript 如何在Typescript中检查自定义接口类型

Javascript 如何在Typescript中检查自定义接口类型,javascript,typescript,Javascript,Typescript,我有 现在,我想检查一个对象,比如: interface A { a_id: string; name: string; } interface B { b_id: string; name: string; } 如何检查类型并确定它是属于A还是B 我试过了,但是要得到这个型号不是更容易吗 更新:所述问题并不表示请求能够在不检查属性的情况下区分类型。不幸的是,这是不可能的;TypeScript编译为JavaScript,这是实际运行的脚本。TypeScript的类型系统在编译代码

我有

现在,我想检查一个对象,比如:

interface A {
  a_id: string;
  name: string;
}

interface B {
 b_id: string;
 name: string;
}
如何检查类型并确定它是属于
A
还是
B


我试过了,但是要得到这个型号不是更容易吗

更新:所述问题并不表示请求能够在不检查属性的情况下区分类型。不幸的是,这是不可能的;TypeScript编译为JavaScript,这是实际运行的脚本。TypeScript的类型系统在编译代码时完全可用,在那里可以找到
A
B
等接口。因此,在运行时没有要检查的
A
B

如果您想在运行时能够区分
myObj
A
还是
B
,您需要编写JavaScript代码来实现这一点。。。例如检查属性。您可以使用TypeScript来帮助您编写此代码并为其进行键入,以便编译器也了解您的属性检查将
A | B
缩小为
A
B
。这就是这个答案的其余部分(以及另一个问题的答案)告诉你的。祝你好运


建议你写一篇文章,这肯定会奏效;这个想法是,你告诉编译器你认为是一个区分<代码> A<代码> >代码> B<代码>的好方法,它会让你使用这个函数来做。 在您的案例中,一个更简单的方法是使用
in
操作符,该操作符(自TypeScript 2.7以来)。例如:

const myObj : A|B = {b_id: '1', name: 'one'};
请注意,这在技术上是不安全的,因为可能有一个类型为
A | B
的对象无法通过这种方式区分:

declare const obj: A | B;
if ("b_id" in obj) {
  // obj is a B in here
  console.log(obj.name.toUpperCase());
} else {
  // obj is an A in here
  console.log(obj.a_id.toUpperCase());
}
请注意,
geteviaorb()
返回一个有效的
a
,因此它是一个有效的
a | B
,但不幸的是,由于数值
名称
属性,它将无法通过上述测试:

function getEvilAorB(): A | B {
  interface EvilA extends A {
    b_id: number;
  }
  const evilA: EvilA = { name: "", a_id: "", b_id: 123 };
  return evilA; // okay, EvilA extends A extends A | B
}
const evilA=getEvilAorB();
如果(“b_id”在Evia中){

console.log(evia.b_id.toUpperCase());//编译,但对于我来说,如果您能够更改这些接口的形状,那么使用鉴别器是最简单的方法

const evilA = getEvilAorB();
if ("b_id" in evilA) {
  console.log(evilA.b_id.toUpperCase()); // compiles but for me is easiest way to use discriminant if you are able to change shape of these interfaces.

interface A {
  discriminantKey: 'interfaceA';
  a_id: string;
  b_id: string;
}

interface B {
 discriminantKey: 'interfaceB';
 b_id: string;
 name: string;
}
在swithc情况下,当您询问您的判别键时,即使在typescript中,也会有type-guard,而不仅仅是runetime

const myType = {...}
switch(myType.discriminantKey) {
  case 'interfaceA':
    // here is type infered to 'A' interface;
   break
  case 'interfaceB':
    // here it is 'b'
}

你可能会觉得很有趣。@Ivan你的链接还说,在运行时无法检查接口(我的想法)。嗨,我在interface
A
中做了一个更正。这是一个打字错误。真诚的道歉。我想忽略检查每个属性来确定类型。谢谢