使用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'