[英]Difference between using typeof for type parameter in a generic vs. without
在 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.
鑒於此,這里有一個表格:
工廠(構造函數)
Car
typeof Car
類型汽車(實例)
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)
但同樣,在某個地方,不知何故,你必須建造汽車才能使用汽車。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.