Хотя мы не можем изменить тип существующего поля в интерфейсе, мы можем изменить тип поля в этом случае. Тип поля Util.Dictionary<ServerMethod>
. Хотя Util.Dictionary
используется в нескольких местах, единственное место, где он используется с аргументом типа ServerMethod
, предназначено для этого члена.
Мы можем расширить интерфейс Dictionary
с помощью дополнительных методов, и методы будут отображаться только в том случае, если параметр типа равен ServerMethod
(также мы делаем небольшой магический insipider из здесь , чтобы не отображать методы, если T
это any
)
declare module 'hapi' {
export namespace Util {
type IfAny<T, Y, N> = 0 extends (1 & T) ? Y : N;
export interface Dictionary<T> {
getUsername<T extends ServerMethod>(this: Dictionary<T> & IfAny<T, never, {}>) : Promise<string>;
}
}
}
let d = new Server({})
let f!: Util.Dictionary<any>;
d.methods.getUsername() // type checked
Примечание
В идеале был бы выделенный тип для methods
, который позволил бы нам добавлять к нему методы, не расширяя очень общий интерфейс Dictionary
, но типизация - это то, чем они являются сейчас. Кто-то может сделать запрос на создание нового интерфейса для methods
....