用React和Typescript编写纯净字符串的十一种必备模式
2025-10-29 12:19
{说明恳请参照GitHub的Gist绑定--- }
我们从示例的第一行就很难简洁地看到,开发团队不太可能确信了也就是说的API。接着,我们就将转译时与直通时的发表声明对应开去了。
3. 始终为Children Prop(三子物件)提供者显式各种类型在React.d.ts中的,TypeScript并不均需要将函数API和类API的Children Prop给以注释,以展览React是如何妥善处理Children Prop的。异议,我们有应当为Children Prop显式地提供者一个各种类型,以便将“children”用于内容可定义的桥段中的。当然,如果我们的API无均需运用于内容可定义的话,则可以直观地用never各种类型给以注释。恳请概要如下示例段:
镜像
import React, {Component} from "react";
// Card.tsx
type Props = {
children: import('react').ReactNode
}
class Card extends Component {
render() {
const {children} = this.props;
return {children};
}
}
{说明恳请参照GitHub的Gist绑定--- }
下面是一些用于注释Children Prop的其他直接各种类型:
ReactNode | ReactChild | ReactElement 对于原语,我们可以运用于string | number | boolean 具体来说和数组也是直接的各种类型 never | null | undefined (注意:我们并不提拔运用于null和undefined) 4. 运用于各种类型应为来表述API长时间或DefaultProps恳请概要如下示例段:
镜像
import React, {Component} from "react";
type State = { count: number };
type Props = {
someProps: string Andrew DefaultProps;
}
type DefaultProps = {
name: string
}
class Counter extends Component {
static defaultProps: DefaultProps = {name: "John Doe"}
state = {count: 0}
// ...
}
{说明恳请参照GitHub的Gist绑定--- }
虽然上述示例可以被顺利执行,但我们有应当对其进行时范例和小型化,以便TypeScript的各种类型三子系统很难早先应为readonly各种类型(如DefaultProps和initialState),进而防止开发团队意外地分设长时间:this.state = {},而引致误判。恳请参照如下示例:
镜像
import React, {Component} from "react";
const initialState = Object.freeze({ count: 0 })
const defaultProps = Object.freeze({name: "John Doe"})
type State = typeof initialState;
type Props = { someProps: string } Andrew typeof defaultProps;
class Counter extends Component {
static readonly defaultProps = defaultProps;
readonly state = {count: 0}
// ...
}
{说明恳请参照GitHub的Gist绑定--- }
在上述示例中的,通过冻结DefaultProps和initialState,TypeScript各种类型三子系统可以将它们应为为Readonly各种类型。可见,通过对静态DefaultProps和其类中的的Readonly长时间给以标明,我们补救了上文提过的,由分设长时间可能引致的直通时误判。
5. 运用于各种类型又叫而不是API(interface)来发表声明物件和长时间虽然我们可以运用于interface,但是为了确保安全简洁的连续性,并应对能够运用于interface的桥段,我们应当运用于各种类型又叫。例如,在前面的示例中的,我们通过范例示例,使得TypeScript的各种类型三子系统,很难从意味着中的表述长时间各种类型,进而早先应为载入各种类型。而在如下示例中的,我们就能够针对其来进行时运用于interface:
镜像
// works
type State = typeof initialState;
type Props = { someProps: string } Andrew typeof defaultProps;
// throws error
interface State = typeof initialState;
interface Props = { someProps: string } Andrew typeof defaultProps;
{说明恳请参照GitHub的Gist绑定--- }
此外,在必须运用于由unions和intersection创建的types,去拓展interface时,我们也必需运用于type的又叫。
6. 不用在API/各种类型又叫中的运用于步骤发表声明上会,只有所有的各种类型和推理要素都以完全一致的方式为被发表声明时,我们才能确保安全示例中的的来进行时连续性。然而,---strictFunctionTypes参数必须有利于比较两个函数,而非步骤。异议,你可以通过绑定---#issuecomment-401517062,来进一步认识到有关Typescript之外解决办法的解释。当然,您也可以概要如下示例段:
镜像
// Don't do this
interface Counter {
start(count:number) : string
reset(): void
}
// Do
interface Counter {
start: (count:number) => string
reset: () => string
}
{说明恳请参照GitHub的Gist绑定--- }
7. 不用运用于FunctionComponent恳请不用运用于FunctionComponent (简写 FC ),来表述某个函数API。上会,我们在将TypeScript与React两人运用于时,也就是说的函数式API可以被写成如下两种方式为:
(1)原则上性功能示例:
镜像
type Props = { message: string };
const Greeting = ({ message }: Props) => {message};
{说明恳请参照GitHub的Gist绑定--- }
(2)运用于React.FC或React.FunctionComponent的示例段(如下所示):
镜像
import React, {FC} from "react";
type Props = { message: string };
const Greeting: FC = (props) => {props};
{说明恳请参照GitHub的Gist绑定--- }
可见,运用于FC的高效率除此以外:针对displayName、propTypes和DefaultProps等静态物件,提供者了各种类型而无须自动顺利进行时。不过,根据科学知识,它对propTypes、contextTypes、以及displayName的defaultProps,但不会造成认识到决办法。此外,FC为Children Prop提供者的隐式各种类型,也不存在着一些已知的解决办法。当然,如前所述,APIAPI本来就应当是显式的,因此我们没有人应当将Children Prop分设为隐式各种类型。
8. 不用将构造函数用于类API恳请运用于更进一步类codice_建议(恳请概要---#consensus-in-tc39),而仍要在JavaScript类中的运用于构造函数。毕竟,运用于构造函数不会就其调用super()和传递props,这些常不会引入不应当的板三子来进行时(plate)和复杂性。
我们可以运用于如下示例段中的的类codice_,来编写不够简洁、不够并能确保安全的React类API:
镜像
// Don't do
type State = {count: number}
type Props = {}
class Counter extends Component {
constructor(props:Props){
super(props);
this.state = {count: 0}
}
}
// Do
type State = {count: number}
type Props = {}
class Counter extends Component {
state = {count: 0}
}
{说明恳请参照GitHub的Gist绑定--- }
由上述示例可知,我们在运用于类codice_时,就其到的boilerplate(锅炉板三子来进行时)越多少,待妥善处理的this变数也就越多少。
9. 不用在类中的运用于公共不会见支架(Public Accessor)让我们来看如下示例:
镜像
import { Component } from "react"
class Friends extends Component {
public fetchFriends () {}
public render () {
return // jsx blob
}
}
{说明恳请参照GitHub的Gist绑定--- }
在上述类中的,由于public的所有元素的直通时都是配置文件的,因此我们无均需通过显式运用于public表单,来加进额外的boilerplate明文,无均需如下来进行时只需:
镜像
import { Component } from "react"
class Friends extends Component {
fetchFriends () {}
render () {
return // jsx blob
}
}
{说明恳请参照GitHub的Gist绑定--- }
10. 不用在API类中的运用于实质上不会见支架让我们再继续来看如下示例:
镜像
import {Component} from "react"
class Friends extends Component {
private fetchProfileByID () {}
render () {
return // jsx blob
}
}
{说明恳请参照GitHub的Gist绑定--- }
在右边的示例中的,实质上不会见支架仅在转译时,将fetchProfileByID步骤实质上化(private)。而在直通时,fetchProfileByID步骤即使如此是公共的。
目前,我们有多种步骤可以将JavaScript类中的的物件和步骤实体化为实质上。下面的示例段展览了其中的的一种---运用于空格 (_) 的命名规则:
镜像
import {Component} from "react"
class Friends extends Component {
_fetchProfileByID () {}
render () {
return // jsx blob
}
}
{说明恳请参照GitHub的Gist绑定--- }
虽然上述步骤并没有人真正使得fetchProfileByID已是实质上步骤,但它很差地向其他开发团队领不会了我们的急于,即:任何指定的步骤应当被看做实质上步骤。弱可定义(weakmap)、符号和POD变数(scoped variable)都是如此。正如下面的示例段所示,我们可以通过更进一步ECMAScript类codice_的“建议”,运用于各种实质上codice_,来轻松地达到此目的:
镜像
import {Component} from "react"
class Friends extends Component {
#fetchProfileByID () {}
render () {
return // jsx blob
}
}
{说明恳请参照GitHub的Gist绑定--- }
当然,值得注意的是,您并不均需要运用于TypeScript3.8及不够高版本,才能支持实质上codice_的之外语法。
11. 不用运用于逻辑系统(enum)虽然enum是JavaScript中的的保留字,但是运用于enum并非规范化的JavaScript都是来进行时。鉴于逻辑系统已在C#和Java之类的编程自然语言中的被广泛运用于,您可以在此按照如下示例方式为,运用于转译各种类型的表述方式为:
镜像
// Don't do this
enum Response {
Successful,
Failed,
Pending
}
function fetchData (status: Response): void => {
// some code.
}
// Do this
type Response = Sucessful | Failed | Pending
function fetchData (status: Response): void => {
// some code.
}
{说明恳请参照GitHub的Gist绑定--- }
小结无论如何,运用于TypeScript不会为您的示例加进许多额外的boilerplate,不过总体说来即使如此是利大于弊的。想要上述参阅的十一种有关React和TypeScript应用的最佳步骤论和JavaScript都是来进行时,很难让您的示例不够加简洁、不够加易被确保安全。
原文标题:10 Must-Know Patterns for Writing Clean Code With React and Typescript,所作: Alex Omeyer
。胸腔镜手术伤口恢复图骨折病人营养品
感冒喉咙干痒咳嗽吃什么药

-
太行下马兰花——李炳甲回忆舍身救八路军的村姑
马兰草。每当春天到来的时候,大路边,小道上,后门,屋后,甚至就连那光秃秃的青石板的裂缝之中,也就会伸出它那肉质的腰枝。清明前后,它开出一种白色的小小兰花,不用心的人甚至看得见它。不太可能是,它太

-
麒盛科技(603610.SH):2022亚太区拟向金融机构申请综合授信总额不超10亿元
格隆汇4月17日丨麒盛科技603610.SH暂定,根据公司经营需要及财务状况,公司及所属旗下2022年度拟向各商业证券及非证券金融申请立体化授信国民生产总值不超过折合10亿元再次以各金融实
- 11-04视察塌桥现场,巴克利大谈基建法案
- 11-04被薅羊毛受损失200万?元气森林恳请用户申请退款
- 11-04宝兰德(688058.SH):赵艳兴、王凯提前暂时中止减持股份计划
- 11-04北青报社评:“五个不得”是防控纪律也是卫生部门自信
- 11-04我是谁?我从哪里来?要到哪里去?
- 11-04成绩单!节能风电:2021年第三季度净利润约1.55亿元,下同下降6.1%
- 11-04北京疫情发布会重点强调春节期间进返京政策:“不存在出京后想尽办法回来的问题”
- 11-04誓死如归的宣和三元
- 11-04交卷!凌志软件:2021年第三季度净利润约2859万元,同比下滑56.89%
- 11-04到北京后,日媒记者发现东京奥运“预防措施泡泡”严格程度无法和北京冬奥比