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

时间:2018-07-02 15:07:16

标签: javascript typescript types

我是Typescript的新手,我正在尝试通过添加所有类型将JS定制库迁移到TS。 这是我尝试做的一个简单示例。 原始JS文件(类)“ parser.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。

2 个答案:

答案 0 :(得分:4)

TypeScript也具有JavaScript具有模块的方式。

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

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

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

  export default Parser;
}

然后您像通常在parser中那样导入utilize.ts

import Parser from 'parser'

const foo = new Parser('test')

进一步阅读:https://www.typescriptlang.org/docs/handbook/modules.html

答案 1 :(得分:0)

没有type定义的构造函数,仅用于类,因此您可能要使用declare,类似以下的内容将起作用:

class Parser {
  constructor(name){
    name;
  }
} 

declare class tbrat {
    constructor(name: string) {

    }
}

const n: tbrat = new Parser('hello');

也请看看Noel Varanda的answer