如何在TypeScript中为函数语句设置指定的函数签名类型?
实现方案
前置准备
先定义一个类型校验工具函数,用来对单个函数做MyFunc类型约束:
type MyFunc = (foo: string) => string; const asMyFunc = (fn: MyFunc) => fn;
函数类型约束用法
1. 函数表达式(含箭头函数)
直接把函数传入工具函数即可,类型不匹配会直接在当前位置报错:
// 校验通过 const validFunc = asMyFunc((foo) => foo + 'bar'); // 直接报错,入参不符合MyFunc定义 const invalidFunc = asMyFunc(() => 'bar');
2. 函数语句(即function 函数名(){}的声明形式)
TS目前没有直接给函数声明加整体类型注解的语法,可使用4.9及以上版本支持的satisfies运算符做后置校验:
function validFunc(foo) { return foo + 'bar'; } // 校验通过,无报错 validFunc satisfies MyFunc; function invalidFunc() { return 'bar'; } // 此处报错,函数类型不符合MyFunc要求 invalidFunc satisfies MyFunc;
数组内单函数独立校验
不需要给数组设置整体类型,直接给每个数组元素套用asMyFunc工具函数即可实现单独校验:
[ asMyFunc((foo) => foo + "bar"), // 校验通过 asMyFunc(() => "bar") // 当前位置直接抛出类型错误 ]
该方案的核心是利用工具函数的入参类型约束实现单函数校验,完全不需要依赖上层数组的类型声明,不符合要求的函数会在自身绑定校验的位置抛出错误,符合需求。
内容的提问来源于stack exchange,提问作者DaDo
相关产品推荐
相关产品推荐

