簡體   English   中英

在泛型中使用 typeof 作為類型參數與不使用 typeof 之間的區別

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM