为何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
相关产品推荐
相关产品推荐

