在旧的原型样式中,“[js]'这个'隐含地具有'any'类型,因为它没有类型注释。”

时间:2018-05-19 14:32:11

标签: javascript typescript typescript-typings tsconfig

我尝试在旧的JavaScript代码中注释类型。使用this类定义时,prototype出现问题。

例如:

/**
 * @constructor 
 * @param {string} name
 * @type {Animal}
 */
function Animal(name){
    this.name=name;
}

Animal.prototype.show = function show(){
    console.log(this.name);
}

var a = new Animal("bob");
a.show();

我得到: enter image description here

当我使用课堂风格时,我没有任何问题:

class AnimalClass{
    /**
     * @param {string} name
     */
    constructor(name){
        this.name=name;
    }

    show(){
        console.log(this.name);
    }
}

var animal = new AnimalClass("bob");
animal.show();

我的tsconfig.json是:

{
  "compilerOptions": {
    "lib":["es2017", "es2015", "dom"],
    "noImplicitAny": true,
    "alwaysStrict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
    "noFallthroughCasesInSwitch": true,
    "allowJs": true,
    "strict": true,
    "strictFunctionTypes": true,
    "strictNullChecks": true,
    "checkJs": true,
    "noImplicitThis": true
  }
}

我的问题是如何在旧式JavaScript中注释类型。

1 个答案:

答案 0 :(得分:0)

除了语法糖之外,ES6类本身也能在TypeScript中提供正确的输入,而常规函数应该显式输入。

本课

function Foo() {};

Foo.prototype.bar = function () {
    this.baz;
};

变为

interface Foo {
    bar(): void;
    baz: any;
}

interface FooStatic {
    new(): Foo;
}

const Foo = <FooStatic><Function>function Foo(this: Foo) {};

Foo.prototype.bar = function (this: Foo) {
    this.baz;
};

为了正确输入。

同一类可以固有地输入为ES6类:

class Foo {
    baz: any;
    bar() {
        this.baz;
    }
}