簡體   English   中英

Typescript class 方法 僅當泛型類型為字符串時

[英]Typescript class method ONLY if generic type is string

使用泛型類型 class,我希望某些方法在泛型類型為“字符串”時才可用。

使用以下代碼

class MyClass<T = string> {
  value: T = null;

  setDate(m: Moment) {
    // could be used only if T is string
    value = m ? m.format('YYYY-MM-DD') : null;
  }

}

給我錯誤

Argument of type 'string' is not assignable to parameter of type 'T'

這非常清楚並且完全有意: Moment.format()返回一個string :D

僅當Tstring時,是否有正確的方法使setDate()方法可用?

提前,非常感謝。


我知道我可以使用m.format('YYYY-MM-DD') as unknown as T來解決這個問題,但它看起來像是一種解決方法,而不是真正的 typescript 解決方案。

我知道條件類型,但我認為它不能解決我的問題。 至少,我沒有找到解決辦法。

使 function never對不正確的通用參數進行 arg

type Moment = {format(s:string):string};

type SimpleEquals<T, V> = [T] extends [V] ? [V] extends [T] ? true : false : false;


class MyClass<T = string> {
  value: T | null = null;

    // could be used only if T is string
  setDate(m: SimpleEquals<T, string> extends true ? Moment : never) {
    this.value = m ? m.format('YYYY-MM-DD') as T : null;
  }
}

declare let m: Moment; 

new MyClass<string>().setDate(m) // ok

new MyClass<number>().setDate() //err
new MyClass<number>().setDate(m) //err

new MyClass<string | number>().setDate() //err
new MyClass<string | number>().setDate(m) //err

new MyClass<'qwe'>().setDate() //err
new MyClass<'qwe'>().setDate(m) //err

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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