在泛型中对类型参数使用typeof与不使用typeof的区别



在TypeScript中,使用

有什么区别?
InstanceType<typeof UserManager>

InstanceType<UserManager>

我看了一下TS的typeof。SomeGeneric<typeof UserManager>真的是一种更一般的类型吗?也就是说,我们可以将typeof UserManager降低到类似Function的水平,这样它实际上就是InstanceType<Function>了?

我假设您在这里谈论的是类,因为它们既作为值(类构造函数)又作为类型存在。

因此,因为UserManager是类的构造函数,所以typeof UserManager是该构造函数的类型。这是与new关键字一起使用的类型,并具有静态方法。

其中类型UserManager为实例接口。

InstanceType<T>所做的是返回构造函数T所创建的实例类型。这意味着这里的T必须是有效的构造函数类型。否则你会得到一个类型错误:

type A = InstanceType<UserManager>
// Type 'UserManager' does not satisfy the constraint 'abstract new (...args: any) => any'.
//  Type 'UserManager' provides no match for the signature 'new (...args: any): any'.(2344)

所有这些都意味着类型:

InstanceType<typeof UserManager>

与类型相同:

UserManager

为什么不能使用类作为类型,而不是在typeof的情况下提取类型?

根本不需要,除非你只有构造函数的类型。在注释中提供的代码片段中,您可以这样做:

const user: UserManager = {
name: "John",
surname: "Doe",
};

游乐场

这样做是因为它实现了UserManager实例的接口契约,即使它不是由UserManager构造函数构造的。所以Typescript对它很满意。


更新:

从这个游乐场链接你得到这个错误:

Argument of type 'typeof Child' is not assignable to parameter of
type 'Parent<{}>'. Property 'method' is missing in type
'typeof Child' but required in type 'Parent<{}>

为什么Child真的是typeof Child?

因为每个value的类型都是typeof value。当您使用Child作为值(通过将其作为参数传递)时,它的类型为typeof Child

这里,值Child是一个类构造函数,它只是一个函数,可以用new调用它来创建Child的实例。

"如果我想通过只传递类Child来使它工作,我该怎么做呢?">

为了在类的实例上执行实例方法,你必须实例化那个类。您的代码调用.method(),这是一个实例方法,但没有创建实例。这是行不通的。

所以你的问题归结为"我如何使用一个类的实例,而不创建一个类的实例?"答案是:你不需要

假设你有一家生产汽车的工厂。你不能命令工厂启动引擎,你只能命令工厂生产的汽车启动引擎。如果你有一个启动汽车的函数,你必须告诉工厂制造一辆汽车,然后把这辆汽车提供给你的函数。

// The "factory" in the above example
class Car {
startEngine() {}
}
const aCar: Car = new Car() // what the factory makes.

考虑到这一点,下面是一个表格:

  • 工厂(构造器)

    • value:Car
    • 类型:typeof Car
  • Car(一个实例)

    • value:new Car()
    • 类型:Car

所以你可以创建一个实例并提供给你的函数:

function foo(instance: MyClass){
instance.someMethod()
}
foo(new MyClass())

或者传递构造函数并在该函数中创建实例:

function foo(someClass: typeof MyClass){
const instance = new someClass()
instance.someMethod()
}
foo(MyClass)

但是,无论如何,你必须在某个地方造出一辆车来使用它。

相关内容

  • 没有找到相关文章

最新更新