如何为现有的全局函数提供TypeScript注释

时间:2016-05-30 17:21:00

标签: javascript typescript

我考虑将TypeScript类型注释添加到现有项目中。 我在提供外部声明文件时遇到了一个非常简单的例子:

program.ts

/// <reference path="types.d.ts"/>

function greet (p) {
    console.log(p.name);
}

var x = {name: 'Mary'};

greet(x);

types.d.ts

interface Person {
    height?: number,
    name: string
}

declare function greet (p: Person): void;

我希望这可行,但我收到以下错误:

program.ts(3,10): error TS2384: Overload signatures must all be ambient or non-ambient.

似乎认为函数定义是重载而不是先前声明的实现。

greet函数添加类型的正确方法是什么?

要求: program.ts应为纯JavaScript,例如,不含任何类型的注释。

1 个答案:

答案 0 :(得分:2)

语言不支持或不允许这样做。基本上代码正在......

interface Person {
    height?: number,
    name: string
}

declare function greet(p: Person): void;

function greet(p: any): void {
    console.log(p.name);
}

因此,您在定义具有相同名称的函数和环境函数时会收到该错误。

  

在greet函数中添加类型的正确方法是什么?

这样做:

interface Person {
    height?: number,
    name: string
}

function greet(p: Person): void {
    console.log(p.name);
}
  

要求:program.ts应该是纯JavaScript,例如,不含任何类型的注释。

在不更改 program.ts 中的代码的情况下,这是不可能的。一种可能性是将 program.ts 更改为 program.js ,然后使用声明文件描述 program.js ,以便在其他文件中使用。这只会意味着使用 program.js 的其他文件可以从知道该文件的类型和结构中受益,但它不会阻止您在 program.js中犯错误

请注意,定义文件的主要用途是为.js个文件而不是.ts个文件中的代码提供类型信息。