打字稿:属性"构造函数"的类型不兼容



我是打字稿的新手,我正在尝试通过添加所有类型将JS自定义库迁移到TS。 这是我尝试做的一个简单的例子。 原始JS文件(类("解析器.js":

class Parser {
constructor(name){
this.name = name;
}
} 
module.exports = Parser;

类型文件 'parsertypes.d.ts':

export type tbrat = {
constructor(name:string): tbrat;
};

TS 使用文件 'utilize.ts':

import Parser from './parser';
import {tbrat} from './parsertypes';
const n: tbrat = new Parser('hello');

错误:

Type 'Parser' is not assignable to type 'tbrat'. Types of property 'constructor' are incompatible. Type 'Function' is not assignable to type '(name: string) => tbrat'. Type 'Function' provides no match for the signature '(name: string): tbrat'.

我不明白我错过了什么。由于特殊原因,我无法将原始JS文件移动到TS。

就像JavaScript有模块一样,TypeScript也有。

如果你正在编写纯 TypeScript,则无需执行以下操作,因为转译器会为您处理这个问题。但是,在创建定义文件时,需要以与 JavaScript 代码相同的方式声明模块。

您需要在parser.d.ts中声明解析器模块:

declare module "parser" {
class Parser {
constructor(name:string): void
}
export default Parser;
}

然后,您可以像往常一样导入parserutilize.ts

import Parser from 'parser'
const foo = new Parser('test')

延伸阅读: https://www.typescriptlang.org/docs/handbook/modules.html

没有构造函数用于仅针对类的type定义,因此您可能希望使用declare,如下所示的内容将起作用:

class Parser {
constructor(name){
name;
}
} 
declare class tbrat {
constructor(name: string) {
}
}
const n: tbrat = new Parser('hello');

也请看看诺埃尔·瓦兰达的回答。

最新更新