类型“ YYY”缺少属性“ XXX”,但类型“ ZZZ”必需

时间:2020-08-10 16:47:52

标签: typescript

我在初始化类属性时遇到麻烦。 我有这样的打字稿代码。

export class myClass  {
  a: number;
  b: number;
  public getCopy(anotherClass: myClass): myClass {
    return {
      a: anotherClass.a,
      b: anotherClass.b
    };
  }
}

但是我收到此错误消息。

类型'{{a:number;缺少属性'getCopy' b:数字; }'但 “ myClass”类型中必需

为什么认为getCopy()是一个属性? 我有C#背景并且C#不需要初始化函数。 有没有一种方法可以创建类实例并初始化属性而不初始化函数? 我正在寻找一种更简单的方法,例如下面的C#代码。

var newInstance = new myClass()
{
  a = 1,
  b = 2
};

不要这样做。

var newInstance = new myClass();
newInstance.a = 1;
newInstance.b = 2;

或者打字稿不可能吗?

3 个答案:

答案 0 :(得分:1)

创建myClass类的新克隆实例:

public getCopy(anotherClass: myClass): myClass {    
  return Object.assign(new myClass(), {...});
}

答案 1 :(得分:1)

getCopy 的myClass属性。您将其声明为myClass的属性。 myClass的实例也可以使用对象符号编写:

const myClassInstance = {
  a,
  b,
  getCopy,
}

由于getCopymyClass上不是可选的,因此您必须具有此属性,并且该属性必须与myClass代数的类型匹配,因此它必须是一个函数。


所有这些,对我来说还不是很清楚,为什么需要一个创建该类副本的实例方法。您可以将其作为独立功能代替。克隆对象的顶层还可以通过几种其他方式完成,包括散布运算符,因此通常也不需要编写自己的函数即可。

const myClass = new myClass();
myClass.a = 1
myClass.b = 2;
const myClassCopy = { ...myClass };

答案 2 :(得分:0)

我真的认为您不需要为所提供的代码提供一个类,只需在接口中描述您的数据结构,例如

interface DataStructure {
  a: number;
  b: string;
}

,然后创建一个具有以下属性的对象,例如:

const instance: DataStructure = { a: 5, b: 'test' };

然后可以将接口以及参数用作函数或返回值。它不必是类,例如:

function someFunction( b: DataStructure): void {
}

someFunction(instance); // works
someFunction({a: 10, b: 'test'}); // works
someFunction({a: 10}); // doesn't work, b is required