![](/img/trans.png)
[英]Typescript generics + conditional types is not assignable to type error
[英]Typescript Generics and not assignable error
我似乎對 typescript 類型的工作原理有一個理解問題。 我有以下情況。 我有一個 class,它提供了一個可以被覆蓋的 function:
/**
* The current log method. Can be overridden to redirect output.
*/
log: (...args: any[]) => void;
我有以下類型
type AzureTransport = {
(...args: any[]): void
}
不,我有一種外觀,看起來像:
export interface DataChampLogger {
info(...args: any[]): void
error(...args: any[]): void
warn(...args: any[]): void
verbose(...args: any[]): void
setLogLevel(level: DataChampLogLevel): void
setTransport<T>(transport: T): void
// implementation
class .... {
setTransport<AzureTransport>(transport: AzureTransport): void {
AzureLogger.log = transport
}
}
}
這不起作用,我收到以下錯誤Type 'AzureTransport' is not assignable to type '(...args: any[]) => void'.ts(2322)
當我將代碼重構為:
export interface DataChampLogger {
info(...args: any[]): void
error(...args: any[]): void
warn(...args: any[]): void
verbose(...args: any[]): void
setLogLevel(level: DataChampLogLevel): void
setTransport(transport: unknown): void
// implementation
class .... {
setTransport(transport: AzureTransport): void {
AzureLogger.log = transport
}
}
}
一切正常,但我不清楚為什么我在第一個版本的實現中出錯。
[編輯] 游樂場鏈接
感謝您的時間和幫助
問候馬蒂亞斯
這是因為 Typescript 不知道您在 class 中使用的AzureTransport
類型將分配給T
,因為T
可能是其他類型。
您可以像這樣添加一個通用約束:
export interface DataChampLogger {
setTransport<T extends AzureTransport>(transport: T): void; // "T extends AzureTransport" is the constraint
}
class MyClass implements DataChampLogger {
setTransport(transport: AzureTransport): void {
}
}
或者,您可以將泛型移動到接口本身,如下所示:
export interface DataChampLogger<T> // generic is here {
setTransport(transport: T): void;
}
class MyClass implements DataChampLogger<AzureTransport> {
setTransport(transport: AzureTransport): void { // no complaints since T is AzureTransport
}
}
順便說一句,這
type AzureTransport = {
(...args: any[]): void
}
是相同的
type AzureTransport = (...args: any[]) => void;
你不需要大括號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.