Я работаю над ts-for-gjs .Он генерирует определения машинописи для gjs , что позволяет использовать библиотеки gobject-introspection, такие как Gtk и GStreamer, во время выполнения JS (на основе Spidermonkey).
Многие из изученных классов имеютпсевдоконструкторы как статические методы, что приводит к тому, что некоторые из них имеют один или несколько статических методов с теми же именами, что и методы в родительских классах, но с разными сигнатурами.
Экспериментируя со способами решения этой проблемы, я обнаружил, что, если я хотел этот API:
export class Parent {
...
static new(arg1: string): Parent
}
export class Child extends Parent {
...
static new(arg1: number, arg2: number): Child
}
все, что мне нужно сделать, это добавить это к Parent
:
static new<T, V>(arg1: T): V
Это также работает, если Parent.new
принимает больше аргументов, чем Child.new
вместо показанного здесь обратного пути.
Что меня озадачивает, почему это работает, когда универсальная форма имеет только один аргумент, но одна из перегрузок принимает два?Я ожидал написать что-то вроде:
static new<T, V>(arg1: T, arg2?: number): V
, но компилятор принимает его без этого arg2, и скомпилированный код работает как нужно и ожидается.Я не жалуюсь, что это так, но я хотел бы понять это, хотя это работает в мою пользу. Это в основном мой вопрос, почему arg2
не требуется?
Для всех, кто интересуется общим типом возвращаемого значения V
, я нашел хорошую причину, чтобы использовать это вместо, скажем,, Child | Parent
, что объясняется в конце этого комментария .