不舉例說明這個問題有點難解釋,所以讓我們看看這個Message型別,它將被擴展并用作其他型別的基型別。
interface Message<E extends string = string, P = any> {
topic: E;
params: P;
}
我有這個用于指示訊息型別的介面。主題和引數是通用的,以確保介面可以針對不同的情況進行擴展,例如:
interface OrderParams {
userId: string;
orderId: string;
}
interface CreateOrderMessage extends Message<'orders.create', OrderParams> {}
interface UpdateOrderMessage extends Message<'orders.update', OrderParams> {}
...
type CustomMessage = CreateOrderMessage | UpdateOrderMessage | ...;
這讓我加嚴格指定topic,并params為此我可以用一個類中使用不同的主題型別:
class PubSub<T extends Message = Message> {
publish(message: T): void;
subscribe(topic: string): void;
}
如果我們CustomMessage作為泛型型別傳遞給PubSub<>它,它將檢查publish方法的型別,但我也想確保方法的topic引數subscribe也使用E泛型型別的T extends Message泛型型別進行型別檢查。
那么,有沒有辦法以某種方式提取另一種泛型型別的泛型型別,以便我可以撰寫如下內容?
subscribe(topic: GenericOf<T, 0>); // 1st generic of T type
subscribe(topic: TypeOfObjectKey<T, 'topic'>); // Type of 'topic' property of T type
uj5u.com熱心網友回復:
subscribe(topic: T['topic'])將確保topic引數的subscribe型別與topic傳遞給泛型的介面的屬性相同。這是從您在問題中提供的代碼派生的示例(我已將其設為錯誤,因此底層型別很容易看到):
interface Message<E extends string = string, P = any> {
topic: E;
params: P;
}
interface OrderParams {
userId: string;
orderId: string;
}
interface CreateOrderMessage extends Message<'orders.create', OrderParams> {}
interface UpdateOrderMessage extends Message<'orders.update', OrderParams> {}
type CustomMessage = CreateOrderMessage | UpdateOrderMessage;
class PubSub<T extends Message = Message> {
publish(message: T): void {};
subscribe(topic: T['topic']): void {};
}
new PubSub<CustomMessage>().subscribe('')
^^
Argument of type '""' is not assignable to parameter of type '"orders.create" | "orders.update"'.
–打字稿游樂場
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/326538.html
上一篇:如何為html元素串列設定型別?
