TypeScript中如何为包含new方法的对象定义类型签名?
如何给包含
new方法的对象定义TypeScript类型签名 嘿,你是不是把TypeScript里类的构造签名和对象的普通方法搞混啦?别担心,其实这个问题比你想的简单——你例子里的new()只是对象的一个普通方法(只是名字刚好叫new而已),完全不用套用类构造函数的那种特殊签名,按照普通对象方法的方式定义类型就可以了。
直接定义类型或接口
最直接的方式是用type或者interface来描述这个对象的结构,把new作为方法名来定义:
用type的示例
// 定义类型:对象有一个名为new的方法,返回string type ObjectWithNewMethod = { new(): string; }; // 符合类型的对象 const k: ObjectWithNewMethod = { new() { return '123'; } }; // 调用测试,类型检查完全通过 console.log(k.new()); // 输出 '123'
用interface的示例
如果你更喜欢用接口,写法几乎一样:
interface IObjectWithNewMethod { new(): string; } const k: IObjectWithNewMethod = { new() { return '123'; } };
带参数的new方法
如果你的new方法需要接收参数,也和普通方法一样在类型里声明参数即可:
type ObjectWithNewMethod = { // 定义方法接收一个number参数,返回string new(num: number): string; }; const k: ObjectWithNewMethod = { new(num) { return `传入的数字是:${num}`; } }; // 调用时必须传number类型参数,否则TypeScript会报错 k.new(456); // 返回 "传入的数字是:456"
关键区别:别和构造签名搞混
这里要特意强调一下:
- 类的构造签名
new () => ClassInstance是用来描述可以用new关键字实例化的构造函数(比如class Foo {}的类型就是new () => Foo); - 而你例子里的
k.new()只是对象的一个普通方法,名字叫new而已,调用方式是对象.方法名(),和调用obj.foo()没有本质区别,所以类型定义完全遵循普通对象方法的规则。
内容的提问来源于stack exchange,提问作者L_K
相关产品推荐
相关产品推荐

