我想創建一個函式f,它接受 aBox<T>作為它的第一個引數,第二個型別的引數T是可選的 if (and only if!) T extends null。
這是人們如何稱呼的f:
let _ = new Box(null)
let o = new Box({})
f(_, null) // ?
f(o, {}) // ?
f(_) // ?
f(o) // ? (should not compile)
這就是我(試圖)定義的方式f:
class Box<V = any> {
constructor(public v: V) {}
}
type _ = null
type O = object
function f<V extends _>(b: Box<V>, v?: V): void
function f<V extends O>(b: Box<V>, v: V): void
function f(b: Box, v?: any) {}
乍一看,這似乎有效。但是有問題!f(o)報告以下錯誤:
Argument of type 'Box<{}>' is not assignable to parameter of type 'Box<null>'.
當我希望用戶f實際看到的錯誤是:
Expected 2 arguments, but got 1.
似乎 TypeScript 優先選擇第二個引數是可選的多載。T當不擴展 null時,如何使它選擇另一個多載?或者以其他方式實作我的目標?
uj5u.com熱心網友回復:
如果您在休息引數中使用條件型別來基本上更改最后一個引數的可選性,您可以獲得所需的錯誤V:
function f<V>(b: Box<V>, ...a: V extends null ? [v?: V]: [v:V]): void
function f(b: Box, v?: any) {}
游樂場鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/426084.html
上一篇:具有所有相同屬性的物件陣列
下一篇:泛型:使用派生型別傳遞映射
