對于以下類和介面宣告:
interface NodeConnection<
TListeners extends any = any,
TBroadcasters extends any = any
> {}
class NodeConnection<
TListeners extends any = any,
TBroadcasters extends any = any
> { ... }
我收到以下打字稿錯誤:
class NodeConnection<TListeners extends unknown = any, TBroadcasters extends unknown = any>
interface NodeConnection<TListeners extends unknown = any, TBroadcasters extends unknown = any>
All declarations of 'NodeConnection' must have identical type parameters.ts(2428)
首先,為什么打字稿認為我正在嘗試擴展unknown而不是any我寫的型別,為什么它認為這兩個型別引數不相同?我應該如何解決這個問題?
uj5u.com熱心網友回復:
這是因為any. 由于any可以接受任何資料型別,因此打字稿不能保證 NodeConnection 的兩個宣告都具有相同的型別。但是,如果您有以下特定型別:
interface NodeConnection<
TListeners extends String,
TBroadcasters extends String
> {}
class NodeConnection<
TListeners extends String,
TBroadcasters extends String
> { }
在這種情況下,打字稿確保基本型別至少具有String. 由于這是允許的。
你可以試試這個:Typescript Playground
uj5u.com熱心網友回復:
- 介面和類需要不同的名字
- 該類應正確實作介面,包括“傳遞”泛型引數
interface INodeConnection<
TListeners extends any = any,
TBroadcasters extends any = any
> {}
class NodeConnection<
TListeners extends any = any,
TBroadcasters extends any = any
> implements INodeConnection<TListeners, TBroadcasters> { }
打字稿游樂場
如果您不打算使用介面向“大多數地方”使用的類公開“介面”,則不需要它,因為類可以在沒有它的情況下使用泛型。
uj5u.com熱心網友回復:
無需同時宣告介面和創建具有該介面的類。您可以簡單地創建類并將其用作介面:
class NodeConnection<
TListeners extends any = any,
TBroadcasters extends any = any
> { ... }
class MyNodeConnection implements NodeConnection<MyListeners, MyBroadcasters>
{
...
}
請注意,這樣使用implements與使用不同extends:
class MyNodeConnection extends NodeConnection<MyListeners, MyBroadcasters>
{
...
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/452955.html
標籤:打字稿
