簡體   English   中英

Typescript Generics 和不可分配錯誤

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

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