其实我最关心的是React.ButtonHTMLAtrribute 为什么要添加<HTMLElement>泛型?
来源:4-11 精益求精 - Buton 组件编码第二部分

慕后端5509432
2020-03-31
1.React.ButtonHTMLAtrribute 为什么要添加“HTMLElement”泛型?
2.在老师没告诉我们的时候,我们应该出于什么预期,以何种方式去寻找这个 React.ButtonHTMLAtrribute 和适用的泛型?
1回答
-
同学你好 你的问题问的非常好 弄清楚这个问题需要稍微高一点的 typescript 水平,所以在这一节并没有讲的非常清楚,让同学先学会这么用即可。
1 首先使用 React.ButtonHTMLAtrribute 必须添加范型,不添加会报错。那么他最终用在哪里呢?如果你打开定义文件一层一层的往下找(要仔细,有很多层),最终它用到了各种事件回掉上面,比如:onFocus,onClick 等等,再往下找,发现它扩展到了 eventTarget 上面
//这个 T 就是我们传入的范型 interface SyntheticEvent<T = Element, E = Event> extends BaseSyntheticEvent<E, EventTarget & T, EventTarget> {}
最后我们发现它应用到了 currentTarget 上面,下面这个 C 就是交叉类型。
interface BaseSyntheticEvent<E = object, C = any, T = any> { currentTarget: C; }
那么最终我们有什么好处呢,就是当我们写事件会调的时候, 这个时候 e.currentTarget 就有了 EventTarget 和 HTMLElment 的类型,你可以快捷的点出它们所有的属性,你可以自己试试看欧
<Button onClick={(e) => {e.currentTarget}}>
2 对于第二个问题,我只能说是靠看文档和经验了。关注 typescript 内置对象 https://github.com/Microsoft/TypeScript/tree/master/src/lib, 没事多看看React/@types 定义,了解它都定义了哪些类型
希望我这么长的回答能让你满意,谢谢!
732022-11-19
相似问题