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你的链接还说,在运行时无法检查接口(我的想法)。嗨,我在interfaceA
中做了一个更正。这是一个打字错误。真诚的道歉。我想忽略检查每个属性来确定类型。谢谢