最近在新项目里开始尝试ts,说实话对于写惯了js的人来讲,最初上手ts是会遇到一些阻碍的,有各种不适应,以及在与框架、lint等配合使用过程中会遇到各种问题。本片笔记记录一些在react中使用ts的代码段。
无状态组件
方式一:
// 将 props 解构的时候指定它们的类型
1 | const App = ({ message }: { message: string }) => <div>{message}</div>; |
方式二:
// 使用 @types/react 提供的无状态组件的通用类型:
1 | const App: React.SFC<{ message: string }> = ({ message }) => <div>{message}</div>; |
补充:
//如果你想在函数体内正确的使用 children 的话,在第一种模式下你需要显示的声明它。SFC已经正确的包含了 children 属性,所以不需要你再声明它的类型了。
1 | const Title: React.SFC<{ title: string }> = ({ children, title }) => ( |
基于 Class 的有状态组件
// 在使用 Typescript 时,React.Component 是一个通用类型 (也被写作 React.Component<PropType, StateType>),所以你实际上需要给它提供 prop 和 state(可选)的类型:
1 | class App extends React.Component<{ |
// 如果你想先声明一个之后用到的变量,那么声明它的类型即可:
1 | class App extends React.Component<{ |
定义 DefaultProps
// 这种模式使用了TypeScript 的 Partial type 特性,这意味着当前的接口只会实现被包裹的接口的一部分,这样我们可以随意拓展 defaultProps 而不需要改其他任何地方
1 | interface IMyComponentProps { |
提取 Prop Types
1 | type AppProps = { message: string } |
// 你也可以在有状态组件中使用(真的,任何类型都可以):
1 | type AppProps = { // like this |
基本的 Prop Types
1 | type AppProps = { |
表单与事件
1 | class App extends React.Component<{}, { // no props |
有用的 React Type
1 | export declare interface AppProps { |
高阶组件 / render props
// 有时你想写一个接受 React 元素或者字符串或者其他的类型的 prop,这种情况下最好的 Type 方式是使用 React.ReactNode,React Node 可以匹配任何合适的类型:
1 | import * as React from 'react'; |
// 如果你使用函数作为渲染的 prop
1 | export interface Props { |
Context
// 使用新的 context API React.createContext:
1 | class Provider extends React.Component<{}, ProviderState> { |
ref
// 使用 React.RefObject:
1 | class CssThemeProvider extends React.PureComponent<Props> { |