有几种常用规则:
- 在定义公共 API 时(比如编辑一个库)使用 interface,这样可以方便使用者继承接口
- 在定义组件属性(Props)和状态(State)时,建议使用 type,因为 type的约束性更强
interface 和 type 在 ts 中是两个不同的概念,但在 React 大部分使用的 case 中,interface 和 type 可以达到相同的功能效果,type 和 interface 最大的区别是:
- type 类型不能二次编辑,而 interface 可以随时扩展
某些场景下我们在引入第三方的库时会发现想要使用的组件并没有导出我们需要的组件参数类型或者返回值类型,这时候我们可以通过 ComponentProps/ ReturnType 来获取到想要的类型。
// 获取参数类型
import { Button } from 'library' // 但是未导出props type
type ButtonProps = React.ComponentProps<typeof Button> // 获取props
type AlertButtonProps = Omit<ButtonProps, 'onClick'> // 去除onClick
const AlertButton: React.FC<AlertButtonProps> = props => (
<Button onClick={() => alert('hello')} {...props} />
)
// 获取返回值类型
function foo() {
return { baz: 1 }
}
type FooReturn = ReturnType<typeof foo> // { baz: number }
typeof
andinstanceof
: 用于类型区分keyof
: 获取 object 的 keyO[K]
: 属性查找[K in O]
: 映射类型+
and-
andreadonly
and?:
加法、减法、只读和可选修饰符x ? Y : Z
: 用于泛型类型、类型别名、函数参数类型的条件类型!
: 可空类型的空断言as
: 类型断言is
: 函数返回类型的类型保护
-
ClipboardEvent<T = Element> 剪切板事件对象
-
DragEvent<T =Element> 拖拽事件对象
-
ChangeEvent<T = Element> Change 事件对象
-
KeyboardEvent<T = Element> 键盘事件对象
-
MouseEvent<T = Element> 鼠标事件对象
-
TouchEvent<T = Element> 触摸事件对象
-
WheelEvent<T = Element> 滚轮时间对象
-
AnimationEvent<T = Element> 动画事件对象
-
TransitionEvent<T = Element> 过渡事件对象
当你的函数,接口或者类:
- 需要作用到很多类型的时候
- 需要被用到很多地方的时候,比如常用的工具泛型 Partial
seMemo 和 useCallback 接收的参数都是一样,第一个参数为回调 第二个参数为要依赖的数据
-
共同作用:
- 仅仅 依赖数据 发生变化, 才会重新计算结果,也就是起到缓存的作用。
-
两者区别:
- useMemo 计算结果是 return 回来的值, 主要用于 缓存计算结果的值 ,应用场景如: 需要 计算的状态
- useCallback 计算结果是 函数, 主要用于 缓存函数,应用场景如: 需要缓存的函数,因为函数式组件每次任何一个 state 的变化 整个组件 都会被重新刷新,一些函数是没有必要被重新刷新的,此时就应该缓存起来,提高性能,和减少资源浪费。
注意: 不要滥用会造成性能浪费,react中减少render就能提高性能,所以这个仅仅只针对缓存能减少重复渲染时使用和缓存计算结果
BlockTag | 含义 | 语法 | 别名 |
---|---|---|---|
@author | 指定项目的作者 | @author <name> [<emailAddress>] |
|
@version | 描述版本信息 | ||
@copyright | 描述一些版权信息 | @copyright <some copyright text> |
|
@callback | 描述一个回调函数 | @callback <namepath> |
|
@type | 描述一个类型 | @type{type} | |
@class | 此函数旨在需要使用"new"关键字调用,即构造函数 | @class [<type> <name>] |
@constructor |
@classdesc | 使用后面的文字来描述整个类 | @classdesc <some description> |
|
@constant | 指明这个对象是一个常量 | @constant [<type> <name>] |
@const |
@default | 记录默认值 | @default [<some value>] |
@defaultvalue |
@description | 描述一个标识 | @description <some description> |
@desc |
@enum | 描述一个相关属性的集合 | @enum [<type>] |
|
@event | 描述一个事件 | @event <className>#[event:]<eventName> |
|
@example | 提供一个如何使用描述项的例子 | ||
@exports | 标识一个由JavaScript模块导出的成员 | @exports <moduleName> |
|
@file | 描述一个文件 | @fileoverview,@overview | |
@function | 描述一个函数或方法 | @function [<FunctionName>] |
@func,@method |
@global | 记录一个全局对象 | ||
@ignore | 忽略文档中的一个标识 | ||
@interface | 这是别人可以实现的一个接口 | @interface [<name>] |
|
@license | 标识你的代码采用何种软件许可协议 | @license <identifier> |
|
@listens | 列出一个标识的监听事件 | @listens <eventName> |
|
@module | 记录一个 JavaScript 模块 | @module [[{<type>}] <moduleName>] |
|
@name | 记录一个对象的名称 | @name <namePath> |
|
@namespace | 记录一个命名空间对象 | @namespace [{<type>}] <SomeName>] |
|
@param | 记录传递给一个函数的参数 | @arg,@argument | |
@private | 标记为私有 | @private [{typeExpression}] |
|
@property | 记录一个对象的属性 | @prop | |
@readonly | 记录数据为只读 | ||
@returns | 记录一个函数的返回值 | @return | |
@see | 更多详细信息请参阅其他一些文档 | @see <namepath> ,@see <text> |
|
@this | this关键字的指向 | @this <namePath> |
|
@todo | 记录一个将要完成的任务 | @todo text describing thing to do |