代码地址: https://codesandbox.io/s/clev...
textarea想复用input组件逻辑时,ts会因为类型不一致报错,这种情况应该怎么写才能复用逻辑并不报错呢
代码地址: https://codesandbox.io/s/clev...
textarea想复用input组件逻辑时,ts会因为类型不一致报错,这种情况应该怎么写才能复用逻辑并不报错呢
10 回答11.2k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答1.5k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
typescript 中关于类型上的复用,最好还是一一对应,所以你这里其实应该是分别声明两个
ref
以及handleFocus
。对于
ref
,由于两个标签元素HTMLInputElement
和HTMLTextAreaElement
彼此不兼容,因此无法使用Union Types
。为啥不兼容呢,看这里(从.d.ts
文件中获取):这里的泛型你传什么就是什么,是唯一的,也就是排它的(除非是它的子类)。
对于
handleFocus
,由于回调函数签名的类型声明为:这里的泛型
T
只要是继承于Element
就可以,因此这里可以通过Union Types
来提供类型声明,如下:当然了,如果你嫌这种写法比较麻烦,可以使用
type alias
。另外,其实出现这种情况的最主要原因是,两个不相干的或者需要分开的组件或者元素耦合在一起造成的,因此根本的解决办法就是,不要将
input
和textarea
放在一起处理,因为它们在类型系统上,确实是两种类型,非要放在一起,必然会涉及到必要的类型断言和Union Types
的使用。