使用instanceof检查某个变量是否为typescript中的类构造函数类型?
我有一个函数,它接收一个带参数的构造函数,并用该构造函数创建一个实例。我必须检查构造函数的类型,但是当我试图检查它时,它显示了一个错误 这些代码我已经试过了 我试过这个:使用instanceof检查某个变量是否为typescript中的类构造函数类型?,typescript,Typescript,我有一个函数,它接收一个带参数的构造函数,并用该构造函数创建一个实例。我必须检查构造函数的类型,但是当我试图检查它时,它显示了一个错误 这些代码我已经试过了 我试过这个: 函数hello(arg:function){ if(arg instanceof typeof MyClass){/..constructor(a:number)。。 返回新参数(123) }else if(MyClass2类型的arg instanceof){/..constructor(a:string)。。 返回新参数(
函数hello(arg:function){
if(arg instanceof typeof MyClass){/..constructor(a:number)。。
返回新参数(123)
}else if(MyClass2类型的arg instanceof){/..constructor(a:string)。。
返回新参数('abc')
}else返回参数(true)
}
但这表明了这一错误:
“instanceof”表达式的右侧必须是“any”类型或可分配给“Function”接口类型的类型。ts(2359)
我也试过:
/。。。
if(arg.prototype instanceof Component){
常数hi=新参数(123)
// ...
}
但是:
无法将“new”与类型缺少调用或构造签名的表达式一起使用。ts(2351)
我想检查一些构造函数的类型,比如:
hello(MyClass)//新的MyClass(123)
你好(MyClass2)//新的MyClass2('abc'))
在Typescript中,构造函数是类的一部分。Typescript编译器将生成Javascript“构造函数”函数(对于ES5或更早版本),或者对于ECMAScript的更新版本,生成的Javascript将保留class
关键字
以下示例的灵感来源于关于的Typescript手册部分
函数不是创建一个接受构造函数参数的函数,而是接受一个Typescript类,然后根据运行时类型实例化并返回该类
接受要实例化的类的Typescript函数示例
控制台输出
请参见中的示例
在选项下的操场中,尝试更改ECMAScript的目标版本。在Typescript中,构造函数是类的一部分。Typescript编译器将生成Javascript“构造函数”函数(对于ES5或更早版本),或者对于ECMAScript的更新版本,生成的Javascript将保留
class
关键字
以下示例的灵感来源于关于的Typescript手册部分
函数不是创建一个接受构造函数参数的函数,而是接受一个Typescript类,然后根据运行时类型实例化并返回该类
接受要实例化的类的Typescript函数示例
控制台输出
请参见中的示例
在选项下的操场上,尝试更改ECMAScript的目标版本。为什么要使用typeof?@FallenReoper它只是实验性的,我希望“typeof MyClass”是MyClass的构造函数类型。为什么要使用typeof?@FallenReoper它只是实验性的,我希望“typeof MyClass”是MyClass的构造函数类型。然后,如何检查某个变量是否是
new(…args:any[])=>any
的实例?(=如何检查某个函数是否是类的构造函数?)类型定义new(…args:any[])=>any
与构造函数需要使用new
关键字调用的任何类型匹配。我们要检查的是变量是实例的类。那么,如何检查某个变量是否是新实例(…args:any[])=>any
?(=如何检查某个函数是否是类的构造函数?)类型定义new(…args:any[])=>any
与构造函数需要使用new
关键字调用的任何类型匹配。我们要检查的是变量是实例的类。
interface Padder {
getPaddingString(): string
}
class SpaceRepeatingPadder implements Padder {
constructor(private numSpaces: number) { }
getPaddingString() {
return Array(this.numSpaces + 1).join(" ");
}
}
class StringPadder implements Padder {
constructor(private value: string) { }
getPaddingString() {
return this.value;
}
}
function instantiateClass(myClass: new (...args: any[]) => any): Padder {
if (myClass instanceof SpaceRepeatingPadder) {
return new myClass(2 /* numSpaces */);
} else if (myClass instanceof StringPadder) {
return new myClass('*' /* value */);
} else {
return new myClass()
}
}
let padder = instantiateClass(SpaceRepeatingPadder);
if (padder instanceof SpaceRepeatingPadder) {
console.log("type narrowed to 'SpaceRepeatingPadder'")
}
if (padder instanceof StringPadder) {
console.log("type narrowed to 'StringPadder'")
}
padder = instantiateClass(StringPadder);
if (padder instanceof SpaceRepeatingPadder) {
console.log("type narrowed to 'SpaceRepeatingPadder'")
}
if (padder instanceof StringPadder) {
console.log("type narrowed to 'StringPadder'")
}
type narrowed to 'SpaceRepeatingPadder'
type narrowed to 'StringPadder'