接口当前不能扩展条件类型。请参阅:(playground链接)
type Test<T> = T extends {} ? { test: T } : {}
// Ok: type with selected condition
interface I extends Test<number> { }
// "Error: An interface may only extend a class or another interface."
interface J<T> extends Test<T> { }
// Ok: type without condition
type Test2<T> = { test: T }
interface K<T> extends Test2<T> { }
此示例展示了其中一个问题:
J<T>
应该允许扩展Test<T>
,以使其更完整,并允许在接口中使用条件类型。
--或--
- 错误信息应该更加明确,因为正如您在上面看到的那样,接口显然可以扩展类型。
8条答案
按热度按时间v64noz0r1#
我们唯一能做的就是改进错误信息。
接口不能扩展条件类型,因为我们无法知道条件类型的所有可能的端点都会解析为可以扩展接口的内容。例如,你可以写
interface I extends number {
,但你可能会有一个条件类型,对于某些类型解析为number
。igsr9ssn2#
你好,我想修复这个bug;请帮我修复它。
ymdaylpp3#
它能否枚举所有可能的结束类型并检查扩展它们是否有效?
gkl3eglg4#
它能否枚举所有可能的结束类型并检查扩展它们是否有效?
不,问题在于现在你的接口本身就是一个条件类型。根据条件,它会扩展其中一个或另一个。
编译器对接口和类做出假设,它们是对象类型。它们不能突然变成条件、联合或交集类型。
nwlls2ji5#
我们最初选择这个错误消息是为了避免必须遍历所有可能的类型,即它不能是联合体,或者是包含泛型类型的交集,或者是涉及泛型类型的Map类型,或者是如果涉及泛型类型,则为索引访问类型。等等。
suzh9iv86#
如果所有可能的类型都是对象类型,并且一个接口扩展了它,那么即使是条件性的接口,它仍然是一个对象类型,对吗?也就是说,尽管它是条件性的,但它仍然保证解析为某种对象类型。
如果这还不是一个足够强有力的保证,因为编译器/类型系统/实现原因,我不会进一步争论。谢谢你的解释!
wxclj1h57#
例如,你可以写
interface I extends number {
但是你不能这样做。这会导致以下错误:
'number' 只指代一个类型,但在这里被用作一个值。
pgky5nke8#
@RyanCavanaugh,你提到我们唯一能做的就是更新错误信息;@mhegazy,你同意吗?如果是的话,诊断信息需要说什么才能比当前的诊断信息更准确?