TypeScript中是否存在函数字面量?如何限制接收特定函数实现?
如何让TypeScript类构造函数仅接收特定函数实例而非签名匹配的任意函数
你定义了如下代码,希望Context类的构造函数只接收fn这个具体函数本身,而不是任何与它签名一致的函数:
const fn = (x: number) => x+1 class Context { constructor( protected callback: fn ) { } }
但遇到了类型错误:
'fn' refers to a value, but is being used as a type here. Did you mean 'typeof fn'?ts(2749) type fn = /*unresolved*/ any
改成typeof fn后,虽然能保证签名一致,但允许传入其他同签名的函数,这不是你想要的效果。
解答
TypeScript确实没有像数字/字符串字面量那样专门的函数字面量类型语法,但可以通过const断言实现仅接收特定函数实例的需求。
实现方式
利用as const让TypeScript将函数识别为唯一的实例类型,而不是泛指同签名的函数类型:
const fn = (x: number) => x + 1 as const; // 提取fn的唯一实例类型 type FnOnly = typeof fn; class Context { constructor( protected callback: FnOnly ) { } } // 正常通过:传入fn本身 new Context(fn); // 类型报错:即使签名一致,另一个函数实例也不允许 const anotherFn = (x: number) => x + 1; new Context(anotherFn); // Type '(x: number) => number' is not assignable to type '(x: number) => number'.
原理说明
当你给函数添加as const断言后,TypeScript会将其类型收窄为该特定函数的唯一引用类型,而不是宽泛的(x: number) => number函数类型。此时只有fn本身能匹配这个类型,其他同签名的函数实例因为是不同的引用,会被类型检查器拒绝。
这种方式就达到了你想要的「必须是该函数字面量实现本身」的要求。
内容的提问来源于stack exchange,提问作者pinkboid
相关产品推荐
相关产品推荐

