useState中的TS声明

2,068 阅读2分钟

useState

我们知道useState的常用形式是这样的

const [state, setState] = useState(initialState);

我们看一下

源码中函数的声明

 function useState<S>(initialState: S | (() => S)): [S, Dispatch<SetStateAction<S>>];
   
 function useState<S = undefined>(): [S | undefined, Dispatch<SetStateAction<S | undefined>>];

首先从左往右看

 function useState<S>

这一部分代表的是使用传递类型S,这里是用的是ts中的泛型,S代表一个类型,如果后面出现S即使用相同的类型

参数部分

(initialState: S | (() => S))

参数可以为两个值,一个是泛型S类型的一个值,或者是一个返回值为S的函数

返回值部分

[S, Dispatch<SetStateAction<S>>]

返回值是一个数组,数字里包含了两个值:

一个是S类型的值,另外一个值我们深入一下:

Dispatch<SetStateAction<S>>

首先我们看下Dispatch和类型,在源码中声明如下:

type Dispatch<A> = (value: A) => void;
type SetStateAction<S> = S | ((prevState: S) => S);

可以看到SetStateAction类型使用尖括号传递类型S,它是一个S类型或者一个S类型为参数返回值也是S类型的函数

Dispatch类型同样使用尖括号传递类型A,它是一个参数为A且无返回值的函数。

现在我们再看这个返回类型:

Dispatch<SetStateAction<S>>

现在它的意思就很明白了,就是一个无返回值的函数,参数类型是S类型的值或一个个S类型为参数返回值也是S类型的函数;

这个时候我们发现useState函数中有两个声明;

这个是ts中的函数重载,即同一个函数提供多个函数类型定义来进行函数重载,目的是重载的pickCard函数在调用的时候会进行正确的类型检查。

下面那个函数定义的意思就是当UseState没有传递类型是的判断

所以当我们写出

const [number, setNumer] = useState(1);
// 或者下面这种形式
const [number, setNumer] = useState<number>(1);

这两种形式的代码都不会报错

\