【发布时间】:2017-02-26 20:47:28
【问题描述】:
有人知道如何使用自定义属性正确添加/扩展所有原生 HTML 元素属性吗?
有了the TypeScript documentation for merging interfaces,我认为我可以这样做:
interface HTMLElement {
block?: BEM.Block;
element?: BEM.Element;
modifiers?: BEM.Modifiers;
}
<div block="foo" />; // error
但我在 vscode 1.6.1(最新)中收到以下 Intellisense 错误:
[ts] 类型“HTMLProps”上不存在属性“block”。
他们所指的HTMLProps 是React.HTMLProps<T>,div 元素被声明为这样使用它:
namespace JSX {
interface IntrinsicElements {
div: React.HTMLProps<HTMLDivElement>
}
}
我尝试重新声明div,但无济于事。
相关:https://github.com/Microsoft/TypeScript/issues/11684
编辑:以下是最终为我工作的:
declare module 'react' {
interface HTMLAttributes<T> extends DOMAttributes<T> {
block?: string
element?: string
modifiers?: Modifiers // <-- custom interface
}
}
【问题讨论】:
-
@MadaraUchiha
extendingReact.HTMLProps<T>怎么样?甚至将声明与React.HTMLProps<T>合并? -
@ZevSpitz 我都试过了,但效果不佳。扩展没有帮助,因为我不能强迫它使用我的界面,它只会使用
React.HTMLProps<T>,而合并声明根本不起作用,它完全忽略了它们。如果您可以提出一个可行的案例,请考虑将其发布为答案。 -
@MadaraUchiha 合并声明根本行不通我猜你的意思是
namespace React { interface HTMLProps<T> { /*custom elements here*/ } }?不知道HTMLProps声明长啥样,可能需要匹配一下。 -
我有一个问题:为什么需要这个?使用
data-*属性有问题吗? -
你能创建 Playground、codepen 或 jsfiddle 吗?
标签: typescript jsx