如何从打字稿中的类中提取类型?

时间:2020-08-10 11:35:46

标签: typescript

我有课:

class Person {
   name: string;
   age: number;
   gender: string;

   constructor(params: any){
     this.name = params.name;
     this.age = params.age;
     this.gender = params.gender;
   }
}

如何从类Person中获取类型,该类型等效于:

 type PersonType = {
   name: string;
   age: number;
   gender: string;
 }

因此我可以将其用于构造函数的params类型。我不想重复代码来编写类似上面代码的类型定义。我正在寻找一种从类定义中获取类型的方法。

我不想重复以下代码:

   name: string;
   age: number;
   gender: string;

3 个答案:

答案 0 :(得分:1)

只需将类指定为类型

Playground

class Person {
  name: string;
  age: number;
  gender: string;

  constructor(params: Person) {
    this.name = params.name;
    this.age = params.age;
    this.gender = params.gender;

    this.gender = params.gender2; // error
  }
}

const test1 = new Person({ age: 1, gender: '1', name: '1' });
const test2 = new Person({ age: 1, gender: '1' }); // error

或者您可以使用Object.assign一次初始化所有字段,但是随后需要为所有字段指定默认值

class Person {
  name: string = "default";
  age: number = 0;
  gender: string = "default";

  constructor(params: Person) {
    Object.assign(this, params);
  }
}

const test3 = new Person({ age: 1, gender: '1', name: '1' });
const test4 = new Person({ age: 1, gender: '1' }); // error

答案 1 :(得分:1)

我不确定,我说对了。

但是也许您想要这个吗?

export class Person {
   name: string;
   age: number;
   gender: string;

   constructor(params: Person){
     this.name = params.name;
     this.age = params.age;
     this.gender = params.gender;
   }

  someMethod?: () => void = () => {};
}

用法示例

const person: Person = new Person(...);

enter image description here

答案 2 :(得分:0)

您可以将类用作类型,例如

def get_export_filename(self, request, queryset, file_format):
    filename = "%s.%s" % ("Réalisations de vente",
                          file_format.get_extension())
    return filename

但是,看到您的评论之后,我想知道为什么您不输入构造函数的参数?

class A { name: string; };
let foo: A = { name: "John" };

这是哪里的问题?