我正在编写a library,我想将其移植到TypeScript。
目前它看起来像这样:
文件 index.js
const is = value => {
// ... Do some returns here
}
is.number = x => typeof x === 'number'
is.bla = x => typeof x === 'bla'
等等。
我写了一个接口来描述is
和它的所有方法。
type TypeQueryMethod = (val: any) => boolean;
interface Is {
(val: any): string;
undefined: TypeQueryMethod;
null: TypeQueryMethod;
// ...
}
当我尝试将is
标记为以下类型时:const is: Is = value => ...
它抛出一个错误:
Type '(value: any) => string' is not assignable to type 'Is'.
Property 'undefined' is missing in type '(value: any) => string'.
这是有意义的,因为对象的声明是拆分的。
如何构造这样一个既是方法又有方法的对象?
3条答案
按热度按时间blmhpbnm1#
更新TypeScript 3.1+
TypeScript 3.1引入了对函数声明属性的支持,允许您以开始的方式执行此操作:
对于TypeScript 3.1之前的版本:
如果你想让类型检查器满意,你可以使用
Object.assign()
返回一个完整的Is
对象,而不需要分阶段构建它:当然,如果你不想改变代码的结构,那么你可以像@Saravana建议的那样,使用type assertion来通知类型检查器
is
肯定是Is
,即使在你完成构建之前,它在技术上不是一个。无论哪种方式都可以,但我更喜欢
Object.assign()
方法,因为如果你忽略了实现某些东西,类型检查器会警告你:而类型Assert方法将不会:
而类型Assert方法不会。这取决于你。
Playground链接到代码
webghufk2#
你不能同时实现一个函数和它的属性。你可以先定义一个函数,然后Assert它到
Is
,然后定义剩下的方法:或者使用工厂函数创建
Is
:aelbi1ox3#
你所需要做的就是将属性设置为可选的:
现在你可以安全地将它定义为
Is
: