我试图找到一种方法来传递一个对象来发挥作用,并在运行库中检查它的类型。这是一个伪代码:
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”
,我无法找到获取a
或B
的真正类型的方法。instanceof
也不起作用,返回了相同的内容。
编辑:我想向通过搜索来到这里的人指出,这个问题专门涉及非类类型,即由接口
或类型
别名定义的对象形状。对于类类型,可以使用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代码。
问题:有没有一种方法可以使用这个声明来检查我加载的文件的正确性?我没有意外的财产?
问题内容: 我有一个接受PDO对象作为参数的方法,以允许用户使用现有连接,而不是该方法打开一个新连接并节省资源: 我知道要检查参数是否为对象,但我想检查是否为PDO对象,而不仅仅是对象。 因为用户可以轻松输入(错误地输入?)另一种对象(一个mysqli或类似的对象),并且整个脚本会破裂。 简而言之:如何检查特定类型对象的变量? 问题答案: 您可以使用: 但是请注意,您不能像否定,所以您应该这样做:
你能告诉我如何在typescript+angular中检查变量的类型吗?