【问题标题】:An object is created without a method of a class. Typescript error: Cannot invoke an object which is possibly 'undefined'. ts(2722)创建对象时没有类的方法。打字稿错误:无法调用可能是“未定义”的对象。 ts(2722)
【发布时间】:2021-12-17 21:19:48
【问题描述】:

晚上好!我是 javascript 和 typescript 的新手。

我有些不明白。我仔细输入了我的代码,情况就出现了。我无法想象,为什么,通过它是基本的东西。看:

class A {
    id: number;
    constructor(id:number){
        this.id=4;
    }
    isIdZero?():boolean{
        if(this.id===0)
            return true;
        else 
            return false;
    }
}

let a : A= new A(0);
let b : A={
    id:9
}

alert(b.isIdZero());

此代码出错“无法调用可能是'未定义'的对象。ts(2722)”

为什么?函数等于 {} 中键入的内容,不是吗?

如何改正?

我的问题可能太原始了,以至于我什么都没找到。

【问题讨论】:

  • 好吧,b.isIdZero undefined 在运行时。你期望那里发生什么(忽略所有 TypeScript 类型)?

标签: javascript typescript class object methods


【解决方案1】:
isIdZero?():boolean{

这里的问号表示您正在定义isIdZero,因此它可能是undefined,而不是一个函数。由于它可能是未定义的,打字稿不会让你调用它,除非你先检查它。例如:

if (b.isIdZero) {
  alert(b.isIdZero());
}

如果您希望 isIdZero 成为强制属性,请删除问号。但是,此更改将导致以下代码开始显示类型错误,因为该对象不具备成为 A 所需的所有属性:

let b: A = {
    id:9
}

您可以将函数添加到您正在创建的对象中

let b: A = {
  id: 9,
  isIdZero: () => false,
}

或者您可以停止尝试将其称为 A,而让它成为一个 id 为数字的对象:

let b = {
  id: 9,
}

【讨论】:

  • 问题是当我添加这个检查时,我的程序告诉我,没有这样的属性!这是未定义的!或者在我的原始代码中,而不是在这个例子中。
  • 我现在该怎么办???
  • 你的目标是什么?您是否希望所有A 都具有isIdZero 功能?或者他们中的一些人拥有它,而另一些人没有?
  • 应该都有这个功能,我加了“?”因为出现了一些错误而没有它。原来是验证姓名和电话的功能(我在做电话簿)
  • K,首先通过删除 ? 使其成为强制性的。在大多数情况下,您只需在需要A 的任何地方调用new A(),它就会正常工作,就像在您的第一行let a : A= new A(0); 中一样。如果您确实需要手动创建一个类似于A 的对象(就像您在第二行尝试做的那样),那么您需要自己添加所有属性。这包括向其添加 isIdZero 属性。
【解决方案2】:

那个?您在 isIdZero 之后使用的运算符?告诉 typescript 您预计此属性可能未定义。

这似乎没有必要,所以你可以删除它。

【讨论】:

  • 问题是当我添加这个检查时,我的程序告诉我,没有这样的属性!这是未定义的!或者在我的原始代码中,而不是在这个例子中。我现在该怎么办???
猜你喜欢
  • 2021-10-27
  • 2019-11-16
  • 2021-08-06
  • 2021-06-03
  • 2021-08-07
  • 2020-02-21
  • 2019-09-15
  • 2019-07-30
  • 1970-01-01
相关资源
最近更新 更多