В этом конкретном примере, я расширяя интерфейс Array<T>
следующим образом:Перезапись/метод коррекции подписи в интерфейсе машинописи
interface BetterArray<T> extends Array<T> {
push(this: BetterArray<T>, value: T): this;
}
Примечание для справки - Array<T>.push
реализуется как этот
interface Array<T> {
push(...items: T[]): number;
}
Но я получаю следующую ошибку во время компиляции:
Interface 'BetterArray' incorrectly extends interface 'T[]'.
Types of property 'push' are incompatible. Type '(this: BetterArray, value: T) => this' is not assignable to type '(...items: T[]) => number'. Type 'this' is not assignable to type 'number'. Type 'BetterArray' is not assignable to type 'number'.
Есть ли способ, которым я могу принудительно проинструктировать TypeScript, что я хочу перезаписать нажимаю на мой интерфейс (например, member hiding in C#)?
Примечание - Я использую машинопись 2.0
Дальнейшее чтение - оказывается, что это чисто вниз, чтобы вернуться типа - в основном я хочу, чтобы обеспечить соблюдение интерфейсом, новый тип возврата ...
interface A {
fn(): number;
}
interface B extends A {
fn(): this;
}
Interface 'B' incorrectly extends interface 'A'. Types of property 'fn' are incompatible. Type '() => this' is not assignable to type '() => number'. Type 'this' is not assignable to type 'number'. Type 'B' is not assignable to type 'number'.
Большое спасибо за это, однако, это немного сложнее, когда дело доходит до даже не используя классы, и нужно немного углубиться в JS, потому что TypeScript просто не способен испускать конструкцию, которую я строю. В связи с этим я нашел другое решение, основанное на вашем.См. Мое решение. – series0ne
. Интересно, что это за конструкция вашего, что машинопись не справляется с –
Ну, для этого нужен конструктор, который может это сделать: new (n ?: T): T & Q .. . и TypeScript плачет, как ребенок, когда я пытался сделать это с помощью класса! –
series0ne