TypeScript 覆盖泛型方法不一致地出错

iswrvxsc  于 2个月前  发布在  TypeScript
关注(0)|答案(1)|浏览(46)

TypeScript版本:3.1.0-dev.201xxxxx
搜索词:override generic
代码:

interface Foo {
  method(): T;
}

interface Bar<T extends Node> extends Foo {
  method(): T2;
}

class Node {}

class T2 {}

const x: Bar<Node> = () => "hi"; // 这里应该报错,因为Bar的method方法没有返回类型为T2的声明

错误信息:

interface Foo {
    method<T>(): T;
}

// Error: Interface 'Bar<T>' incorrectly extends interface 'Foo'.
interface Bar<T extends Node> extends Foo {
    method<T2 extends T>(): T2;
}

// Uncommenting this suddenly fixes the error
// interface Foo {
//     method<T>(): T;
// }

预期行为: 错误总是出现,或者总是不出现。
实际行为: 部分接口神秘地移除了错误。
**Playground链接:**https://www.typescriptlang.org/play/#src=interface%20Foo%20%7B%0D%0A%20%20%20%20method%3CT%3E()%3A%20T%3B%0D%0A%7D%0D%0A%0D%0Ainterface%20Bar%3CT%20extends%20Node%3E%20extends%20Foo%20%7B%0D%0A%20%20%20%20method%3CT2%20extends%20T%3E()%3A%20T2%3B%0D%0A%7D%0D%0A%0D%0A// Uncommenting this suddenly fixes the error

// interface Foo {
// method(): T;
// }
// interface Bar extends Foo {
// method(): T2;
// }
// class Node {}
// class T2 {}
// const x: Bar = () => "hi"; // 这里应该报错,因为Bar的method方法没有返回类型为T2的声明

toiithl6

toiithl61#

我认为这与重载有关。
这里没有错误:

interface Foo {
    method<T>(): T;
    method<T>(): T;
}

class Bar implements Foo {
    method<T extends string>(): T { throw new Error(); }
}

但是,如果只写一次 method ,就会出错。

相关问题