typescript javascript文件子类中定义的属性出现类型脚本错误

x7yiwoj4  于 2023-03-13  发布在  TypeScript
关注(0)|答案(2)|浏览(129)

我正在使用Typescript检查我的Javascript文件。当我从一个类扩展时,Typescript不再知道父类中属性的类型。我很好奇我是否遗漏了一些明显的东西,或者Typescript只是不支持检查:

class Foo {

/**
 * @param {number} a
 */
  constructor(a) {

    this.a = a;

  }
}

class Bar extends Foo {

  constructor() {
    super(5);
  }

  move() {
     const foo = this.a + 5;
     this.a = foo;

  }

}

错误:

'foo' implicitly has type 'any' because it does not have a type annotation and is referenced directly or indirectly in its own initializer.
    'a' implicitly has type 'any' because it does not have a type annotation and is referenced directly or indirectly in its own initializer.

我希望Typescript能够理解this.a具有number类型,因为当属性在当前类(而不是父类)中定义时,它 * 确实 * 理解这一点

mklgxw1f

mklgxw1f1#

我希望TypeScript能够理解this. a具有类型号
你所期待的东西叫做“类型推断”,TypeScript在推断类型方面非常聪明,但是当类型在源代码中不明显时,它就不能推断类型。
例如,TS可以确定性地推断a在这里是number

let a = 5;

但是,在这里不能确定地推断anumber

function foo(x) {
    return x;
}

let a = foo(5);

医生评论,

/**
 * @param {number}
 */

不是标准的TypeScript,因此这对您没有任何帮助。

yftpprvb

yftpprvb2#

Barmove方法中,有一个循环类型推断:您将Bar.a设置为值foo,该值是使用Bar.a计算的,没有显式注解-因此出现错误:
...隐式具有类型“any”,因为它没有类型注解,并且在其自己的初始值设定项中直接或间接引用。(7022)
以下是三种解决方案:
1.防止不必要的推断-不要使用中间变量:
TSPlayground

move() {
  this.a = this.a + 5;
}

1.显式注解(强制转换)foo的类型:
TSPlayground

move() {
  const foo = /** @type {number} */(this.a + 5);
  this.a = foo;
}

1.从thisBar)获取值,但将值设置为superFoo)-并维护离散推理站点:
TSPlayground

move() {
  const foo = this.a + 5;
  super.a = foo;
}

Bar示例上的属性a的访问仍将从prototype属性解析。

相关问题