定义一个类型AnyFn,代表任意的函数:
export type AnyFn = (...args: any[]) => any; let a: AnyFn; a = (data) => console.log(data); a('Jerry'); a = 1; // 语法错误
上面代码将1赋给a,会引起编译错误,因为1的类型是number.
定义一个MemoizedProjection类型:
export type MemoizedProjection = { memoized: AnyFn; reset: () => void; setResult: (result?: any) => void; clearResult: () => void; };
定义一个变量,类型为MemoizedProjection:
let a: MemoizedProjection; let b = (data) => console.log(data); a.memoized = b; a.reset = () => console.log('reset'); a.setResult = (result) => console.log(result); a.clearResult = () => console.log('clear');
上述代码执行会报错误:
Uncaught TypeError: Cannot set property ‘memoized’ of undefined:
下图29行,尖括号里的T不能换成any. any不能出现在类型参数的位置里。如果表示任意类型,不出现在类型参数的位置,可以用any.
Generic type ‘MemoizedSelector’ requires between 2 and 3 type arguments.
interface里添加method:
看个Spartacus的例子:一个函数除了本身的实现之外,还多了4个属性,分别指向4个另外的函数:
memoizedProjector构造完毕:
通过下面这个方法构造的:
Object.assign. 该方法会把输入参数的各个对象的属性做一个合并: