假設我有一個類有一個精心設計的泛型型別引數,比如
class SomeStuff<T extends ElaborateStuff> {...}
在其他地方,我有一個帶有SomeStuff引數的函式,例如
function doSimpleThings(stuff: SomeStuff<X>): void {...}
它獨立于X作為 的擴展的特定化身ElaborateStuff。編譯器抱怨以上內容,因為Xmust extend ElaborateStuff. 我可以寫
function doSimpleThings(stuff: SomeStuff<any>): void {...}
但隨后 eslint 抱怨顯式使用any. 除了關閉any警告還有其他方法嗎?在 Java 中,我會使用<?>Typescript 中是否有類似的語法?
uj5u.com熱心網友回復:
TL;DR:?打字稿中沒有語法。如果您可以使用除 之外的任何東西any,這實際上取決于您的泛型型別的變化,但您可能會使用any通常最終是不變的類。
這是一個差異問題的核心。如果你想了解更多,你可以在這里查看我的演講
如果類是 co-varinat,您可以使用,ElaborateStuff并且任何實體化都SomeStuff將與它兼容SomeStuff<ElaborateStuff>,所有實體化的基類也是如此:
type ElaborateStuff = {
a: string
}
class SomeStuff<T extends ElaborateStuff> {
getVStuff(): T {
return null!;
}
}
function doSimpleThingsElaborateStuff(stuff: SomeStuff<ElaborateStuff>): void { }
doSimpleThingsElaborateStuff(new SomeStuff<{ a: "", }>()); //OK
doSimpleThingsElaborateStuff(new SomeStuff<{ a: "", b: "",}>()); // OK
function doSimpleThingsNever(stuff: SomeStuff<never>): void { }
doSimpleThingsNever(new SomeStuff<{ a: "", }>()); // Error
doSimpleThingsNever(new SomeStuff<{ a: "", b: "",}>()); // Error
游樂場鏈接
如果您的類是逆變的,您可以使用never 并且任何實體化都SomeStuff將與它兼容SomeStuff<never>,所有實體化的基類也是如此:
type ElaborateStuff = {
a: string
}
class SomeStuff<T extends ElaborateStuff> {
getStuff = (v: T): void => null!
}
function doSimpleThingsElaborateStuff(stuff: SomeStuff<ElaborateStuff>): void { }
doSimpleThingsElaborateStuff(new SomeStuff<{ a: "", }>()); // error
doSimpleThingsElaborateStuff(new SomeStuff<{ a: "", b: "",}>()); //error
function doSimpleThingsNever(stuff: SomeStuff<never>): void { }
doSimpleThingsNever(new SomeStuff<{ a: "", }>()); // ok
doSimpleThingsNever(new SomeStuff<{ a: "", b: "",}>());// ok
游樂場鏈接
但是,如果您的型別是不變的,則只能使用any. Lint 規則很有用,但可以忽略,并且 有很好的用例any,例如在這種情況下。但是你應該知道這是型別不安全的,所以你不應該依賴編譯器來檢查任何涉及型別引數的操作:
type ElaborateStuff = {
a: string
}
class SomeStuff<T extends ElaborateStuff> {
getStuff = (v: T): T => {
v.a.big(); // error if a is not there
return v;
}
}
function doSimpleThingsElaborateStuff(stuff: SomeStuff<ElaborateStuff>): void { }
doSimpleThingsElaborateStuff(new SomeStuff<{ a: "", }>()); // error
doSimpleThingsElaborateStuff(new SomeStuff<{ a: "", b: "",}>()); //error
function doSimpleThingsNever(stuff: SomeStuff<never>): void { }
doSimpleThingsNever(new SomeStuff<{ a: "", }>()); // error
doSimpleThingsNever(new SomeStuff<{ a: "", b: "",}>());// error
function doSimpleThingsAny(stuff: SomeStuff<any>): void {
stuff.getStuff({}) // will trigger an error
stuff.getStuff({ a: ""}).foo // error on foo access
}
doSimpleThingsAny(new SomeStuff<{ a: "", }>()); // ok
doSimpleThingsAny(new SomeStuff<{ a: "", b: "",}>()); // ok
游樂場鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/363825.html
上一篇:如果在Rust中可用,則使用saturating_add,回退到浮動的常規添加
下一篇:在泛型類中實作泛型介面方法
