在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
- value:
Car(一个实例)
- value:
new Car()
- 类型:
Car
- value:
所以你可以创建一个实例并提供给你的函数:
function foo(instance: MyClass){
instance.someMethod()
}
foo(new MyClass())
或者传递构造函数并在该函数中创建实例:
function foo(someClass: typeof MyClass){
const instance = new someClass()
instance.someMethod()
}
foo(MyClass)
但是,无论如何,你必须在某个地方造出一辆车来使用它。