我正在尝试建立一个typescript-react-eslint
项目,并且无法克服此样板组件的eslint错误:
import * as React from "react";
interface ButtonProps {
children?: React.ReactNode,
onClick?: (e: any) => void,
}
const styles = {
border: "1px solid #eee",
borderRadius: 3,
backgroundColor: "#FFFFFF",
cursor: "pointer",
fontSize: 15,
padding: "3px 10px",
margin: 10
};
const Button: React.FunctionComponent<ButtonProps> = props => (
<button onClick={props.onClick} style={styles} type="button">
{props.children}
</button>
);
Button.defaultProps = {
children: null,
onClick: () => {}
};
export default Button;
错误是:
19:26 error 'onClick' is missing in props validation react/prop-types
20:12 error 'children' is missing in props validation react/prop-types
似乎正在抱怨HTML <button>
的接口未定义?
否则,它可能是Button
组件本身,但是否应该不从我传递给它的<ButtonProps>
接口获取类型信息呢?
我尝试像这样显式设置children
和onClick
:
Button.propTypes = {
children?: React.ReactNode,
onClick?: (e: any) => void
};
它绕过eslint错误,但是组件本身停止工作。 我在做什么错了?
P.S。这是我的.eslintrc.json
{
"env": {
"browser": true,
"commonjs": true,
"es6": true
},
"extends": [
"eslint:recommended",
"plugin:react/recommended",
"plugin:@typescript-eslint/eslint-recommended"
],
"globals": {
"Atomics": "readonly",
"SharedArrayBuffer": "readonly"
},
"settings": {
"react": {
"pragma": "React",
"version": "detect"
}
},
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaFeatures": {
"jsx": true
},
"ecmaVersion": 2018,
"sourceType": "module"
},
"plugins": [
"react",
"@typescript-eslint"
],
"rules": {
"indent": [
"error",
2
],
"linebreak-style": [
"error",
"unix"
],
"quotes": [
"error",
"double"
],
"semi": [
"error",
"always"
]
}
}
答案 0 :(得分:2)
更多答案信息。
首先,两种方法都适用于声明类型,但是React.FC具有一些附加的好处。 https://github.com/typescript-cheatsheets/react-typescript-cheatsheet/blob/master/README.md#function-components
在您的情况下,您可能正在使用eslint-react-plugin,它为eslint建议了规则'plugin:react / recommended',
检查原型的规则是其中之一,检查打字稿示例。
https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/prop-types.md
因此react / prop-types规则将与TS接口冲突,这就是为什么它显示该错误的原因,一旦添加:ButtonProps,我们就不必提供React.FC
答案 1 :(得分:2)
这个规则对 TypeScript 没有意义,因为你已经在检查类型了。
在此 question 中,您找到了禁用此规则的简单方法,只需添加您的 eslint 配置:
rules: {
'react/prop-types': 0
}
答案 2 :(得分:0)
我最终将组件重写为:
const Button = ({ children, onClick }: ButtonProps) => {
return <button onClick={onClick} style={styles} type="button">
{children}
</button>;
};
: React.FC<ButtonProps>
部分被eslint忽略了,所以我决定以更直接的方式提供prop类型