【发布时间】:2019-03-15 20:33:48
【问题描述】:
在现代 JS 中,我们可以像这样直接为 React 组件设置初始状态:
class App extends React.Component {
state = {value: 10}
render() {
return <div>{this.state.value}</div>
}
}
当我尝试使用 Typescript 执行此操作时,TSLint 说“类属性 'state' 必须标记为 'private'、'public' 或 'protected'”。如果我将其设置为“私有”,linter 将在App 上报告Class 'App' incorrectly extends base class 'Component<{}, { value: number; }, any>'. Property 'state' is private in type 'App' but not in type 'Component<{}, { value: number; }, any>'.。我知道我可以调整 linter 规则来跳过这种检查,但是检查类属性的可见性通常是我想要利用的一件好事。
测试完所有三个选项后,仅选择“public”不会让 TSLint 抛出错误。但是由于这里的 state 代表了这个特定组件的内部状态,将其设置为 public 似乎很奇怪。我的做法是否正确?
class App extends React.Component<{}, { value: number }> {
public state = { value: 10 };
public render() {
return <div>{this.state.value}</div>;
}
}
在我在网上找到的所有 TS-React 教程中,都使用了构造函数,就像在旧的 JS 语法中一样。
class App extends React.Component<{}, { value: number }> {
constructor(props: any) {
super(props);
this.state = { value: 10 };
}
public render() {
return <div>{this.state.value}</div>;
}
}
在 Typescript 中直接设置类属性是否被认为是一种不好的做法/样式?
【问题讨论】:
-
我通常避免使用构造函数,因为设置属性不需要它(现代 JavaScript 也不再需要它)。我不认为这是不好的做法/不好的风格。如果您不指定关键字
public,它将自动公开。如果你愿意,你可以使用private,因为无论如何你都不会在课堂外使用状态,但最终它并不重要。 -
是的,我在写JS的时候也避免使用构造函数。在这种情况下,如果我使用
private,TSlint 将在App上报告Class 'App' incorrectly extends base class 'Component<{}, { value: number; }, any>'. Property 'state' is private in type 'App' but not in type 'Component<{}, { value: number; }, any>'.。我知道我可以将 TSlint 配置为隐藏这种检查,但是检查类属性的可见性通常是我想要利用的一件好事。 -
见stackoverflow.com/a/52688791/3731501。 在我在网上找到的所有教程中,都使用了构造函数,就像在旧的 JS 语法中一样 - 编写教程的人不一定精通他们所写的东西。 TSlint 说“类属性 'state' 必须标记为 'private'、'public' 或 'protected'”。如果我使用私有,TSlint 会报告 - 禁用此规则,
public是多余的。state不应该是私人的。 -
“将其设置为公开似乎很奇怪”。
Component中的public就是这样。这没什么好担心的。 -
@cartant OP 声明第一个 sn-p 产生 linter 错误。这表明存在明确指定可见性的 lint 规则(我从未注意到这样的规则,因为它似乎没用)。
标签: reactjs typescript class constructor