React.FC的注解是有些问题的,在是否优先使用这个类型作为注解上存在一部分争议,因为这个类型破坏了JSX.LibraryManagedAttributes, 导致其忽略了函数和类组件的defaultsProps,displayName这样的参数 (详见:https://github.com/typescript-cheatsheets/react/issues/87)。另外,其不能像class组件一样返回props的children (详见:https://github.com/DefinitelyTyped/DefinitelyTyped/issues/33006) ,显式的定义children属性,或更改源码可解决这个问题。
还有一点,FC在@types/react18之前总是隐式的定义好children,即使你的Props注解并没有定义children,你仍然可以在参数里解构出它。
在@types/react版本16.8和18之间可以使用React.VoidFunctionComponent或React.VFC替代 React.FC ,它规定要想在函数体内使用props必须显示的定义它
因为编译器的限制 在函数组件中,不能返回除jsx和null以外的值,如果真的需要返回除这两种之外的值,可以使用类型断言,例如
函数的执行结果在给其他变量进行赋值,会发现该变量的注解有问题
解决办法:
useImperativeHandle
,forwardRef
React.Component
时,为了更好的注解state
可以在React.Component<MyState>
和state:MyState {}
两处做注解,因为这两处分管不同declare
声明接口类型别名和接口非常相似,在很多情况下你可以自由选择它们。
几乎所有的功能都在interface中可用type, 关键区别在于不能重新打开类型以添加新属性与始终可扩展的接口。
因为InputEvent在各个浏览器支持度不一样,所以可以使用KeyboardEvent代替