TypeScript中如何为对象的箭头函数成员直接应用函数类型?
能否直接为对象中的箭头函数成员分配完整函数类型?
给定如下代码:
const parameters = { someNumberMember: 1 as number, someArrowFunctionMember: () => { return true; } }
是否存在语法可以直接为someArrowFunctionMember分配完整的函数类型定义(而非仅定义参数和返回类型)?比如类似下面的写法(但该写法无法生效):
... someArrowFunctionMember: () => { return true; } as DesiredType, ... ^^^^^^^^^^^^^^^ 无法生效
已知可行方案
我已经知道两种更优的实现方式,但好奇是否有更直接的语法:
- 为整个
parameters对象指定包含目标类型的对象类型:
type ParametersType = { someNumberMember: number; someArrowFunctionMember: () => boolean; } const parameters: ParametersType = { someNumberMember: 1 as number, someArrowFunctionMember: () => { return true }, }
- 将箭头函数提取为单独变量,先指定类型再赋值给对象成员:
const handler: () => boolean = () => { return true }; const parameters = { someNumberMember: 1 as number, someArrowFunctionMember: handler, }
已尝试的其他写法
- 使用
as关键字断言普通函数类型,可正常生效:
const parameters = { someNumberMember: 1 as number, someArrowFunctionMember: function() {return true;} as () => boolean, } ^^^^^^^^^^^^^^^^^ 完美生效
- 尖括号类型转换在普通函数中也可行,但最初因TS结合JSX的配置问题失效,禁用
tsconfig中的jsx选项后即可正常使用:
const parameters = { someNumberMember: <number> 1, someArrowFunctionMember: <Function> function() {return true;}, }
直接实现的语法方案
其实存在直接为对象内箭头函数成员分配完整类型的语法,问题出在运算符优先级上:as的优先级高于箭头函数,导致TS无法识别你要断言的是整个箭头函数。只需将箭头函数用括号包裹后再做类型断言即可:
// 直接断言为具体函数类型 const parameters = { someNumberMember: 1 as number, someArrowFunctionMember: (() => { return true; }) as () => boolean, };
如果提前定义了目标类型(比如DesiredType),同样适用:
type DesiredType = () => boolean; const parameters = { someNumberMember: 1 as number, someArrowFunctionMember: (() => { return true; }) as DesiredType, };
只要箭头函数的实际逻辑与断言类型兼容(开启严格模式时需确保完全匹配),这种写法就能正常工作,和普通函数的断言逻辑一致。
内容的提问来源于stack exchange,提问作者Lukas Müller
相关产品推荐
相关产品推荐

