人类终究逃不过真香定律, 曾几什么时候,一度反感 ts
的我, 现在写代码不用 ts
的智能提示就浑身难受 最近恰好维护 以前发布的一个 插件 react-jinke-music-player , 因为是 es6
写的 学习了下 怎么让其支持 ts
react
好比咱们打开一个 支持 ts
的模块 scroll-into-view-if-needed
, 当咱们 cmd + 鼠标左键 点击的时候 会 自动跳转到 其模块的定义git
当咱们 使用其方法时 配合 vscode
就有对应参数的提示es6
这时候咱们大概明白了, 要支持 ts
咱们只须要提供一个 类型定义文件便可 , 官方把它称做 .d.ts
文件, 这这个文件中 咱们须要编写接口 interface
, 接下来以 react-jinke-music-player
为例, 咱们编写一个 index.d.ts
文件github
咱们像往常同样npm
yarn add react-jinke-music-player
复制代码
而后引入, 这时候会发现报错了, 如图所示, 提示咱们 找不到声明文件json
接下来开始编写 index.d.ts
文件数组
import * as React from 'react';
export interface ReactJkMusicPlayerAudioList {
name: string | React.ReactNode,
singer?: string | React.ReactNode,
cover: string,
musicSrc: string,
lyric?: string,
}
export interface ReactJkMusicPlayerProps {
audioLists: Array<ReactJkMusicPlayerAudioList>,
mode: 'mini' | 'full'
}
export default class ReactJkMusicPlayer extends React.PureComponent<ReactJkMusicPlayerProps, any> { }
复制代码
假设咱们的插件 支持一个 audioLists
的参数, 这个参数是一个数组, 每个下标 是 name
, singer
, cover
, musicSrc
, lyric
组成的 object编辑器
React.PureComponent<props, state>
是一个泛型, 咱们将当前组件的 props
和 state
声明便可, 这里的 props 也就是 ReactJkMusicPlayerProps
,学习
用户不须要支持 组件内部有哪些 state
, 因此写 any 便可, 这样咱们就完成了 一个 d.ts
文件的编写, 那么问题来了, 编辑器怎么知道当前组件的 d.ts
文件在哪里呢?ui
其实很简单, 在 package.json
中 咱们都知道 main
字段 声明 入口文件, 那么同理 typing
字段 声明 组件的 类型定义文件, 这里咱们 写 index.d.ts
便可
{
"name": "react-jinke-music-player",
"version": "4.3.2",
"description": "Maybe the best beautiful HTML5 responsive player component for react",
"main": "lib/index.js",
"typing": "index.d.ts",
}
复制代码
如今将这个组件发布 从新安装, 看下效果
npm publish .
yarn add react-jinke-music-player
复制代码
能够看到, 编辑器已经能正确找到定义文件并推断出来, 这里咱们定义的 audioLists
是一个 必填 参数, 因此报错了
有哪些参数, 参数的可选项是哪些, 一目了然
在多人协助的项目中, 有完善类型定义的 ts
项目是很是有必要的, 让你在写代码或者重构的时候 很是清闲放松, 那个参数类型不对, 参数值有哪些 一目了然, 固然前提别写 any
: )