You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何TypeScript接口无法直接扩展索引访问类型?

TypeScript接口继承JSX内置元素类型报错的原因

我定义了一个类型别名,再让接口继承它,代码可以正常运行:

type IntrinisicDivProps = JSX.IntrinsicElements['div'];

interface SomeComponentProps extends IntrinisicDivProps {
  // 新增属性
}

但我觉得没必要多此一举,既然IntrinisicDivProps完全等价于JSX.IntrinsicElements['div'],直接让接口继承后者应该也行,于是写了下面的代码:

interface SomeComponentProps extends JSX.IntrinsicElements['div'] {
  // 新增属性
}

结果却触发了TypeScript错误:

An interface can only extend an identifier/qualified-name with optional type arguments.ts(2499)

明明两者类型完全一样,为什么前者能继承,后者却不行?


这是TypeScript的语法规则限制导致的:

  • 接口的extends关键字后面,只能跟标识符(比如类型别名名称)或者带可选类型参数的限定名,本质上要求是一个可以直接被识别的「类型名称」结构。
  • JSX.IntrinsicElements['div']属于索引访问类型,是一种动态的类型表达式,不符合extends对右侧操作数的语法要求。
  • 而把索引访问类型赋值给一个类型别名(IntrinisicDivProps)后,这个别名就成了合法的标识符,自然可以被接口继承。

简单说:两者在类型语义上等价,但在语法结构上符合的规则不同,TypeScript对接口继承的右侧表达式有严格的语法限制,索引访问表达式不在允许的范围内。

内容的提问来源于stack exchange,提问作者machineghost

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 16:45:58