Typescript构造函数和getter属性

g6ll5ycj  于 2023-04-13  发布在  TypeScript
关注(0)|答案(2)|浏览(132)

有没有可能为一个类创建一个构造函数,它把这个类的一个示例作为参数?

export class simple {
  id: number;
  name: string;
  constructor(value: simple) {
    this = value  //I know this doesn't work but this is what I want to achieve
  }
}

这是因为我在类上也有一个getter ...

get displayText(): string {
  return `${this.name} (${this.id})`;

...我有一个服务,它发出一个返回Observable<simple[]>的API调用,但我必须使用构造函数Map返回的对象,因为没有它,displayText返回undefined
所以为了简单起见,我想通过将从服务返回的对象传递到构造函数来创建类的新示例,而不是创建一个列出该类所有属性的构造函数。这可能吗?

lvmkulzt

lvmkulzt1#

从描述中可以看出,从服务中获取的对象**并不是Simple ¹的示例,它们是类似于Simple示例的纯数据shell,因此使用Simple作为构造函数参数的类型是不正确的。
相反,我会定义一个纯数据类型(也许是SimpleDTO)来建模这些类型。然后你可以接受其中一个类型,并将其属性分配给正在构造的示例。例如(但请继续阅读):

export interface SimpleDTO {
    id: number;
    name: string;
}
export class Simple implements SimpleDTO {
    id!: number;
    name!: string;
    constructor(value: SimpleDTO) {
        Object.assign(this, value);
    }
    get displayText() {
        return this.name; // or whatever
    }
}

Playground链接
注意示例属性上的“is definitely assigned”Assert,因为TypeScript不知道Object.assign将赋值给这些属性。这是使用Object.assign的一个问题。
另一个是Object.assign(this, value)将分配value的所有属性,甚至是超出SimpleDTO类型的属性。
出于这些原因,您可以考虑使用显式列表:

export interface SimpleDTO {
    id: number;
    name: string;
}
export class Simple implements SimpleDTO {
    id: number;
    name: string;
    constructor(value: SimpleDTO) {
        this.id = value.id;
        this.name = value.name;
    }
    get displayText() {
        return this.name; // or whatever
    }
}

Playground链接
¹(我使用了首字母大写,因为这是压倒性的标准命名约定。

hrirmatl

hrirmatl2#

您可能最好创建一个接口,列出您的服务返回的对象的所有属性。

interface FooVal {
    id: number;
    name: string; 
    city: string;
}

class Foo {
    public id: number;
    public name: string;
    public city: string;

    public get displayText(): string {
        return `${this.name} ${this.id}`;
    }

    constructor(a_foo: FooVal){
        this.id = a_foo.id;
        this.name = a_foo.name;
        this.city = a_foo.city;
    }
}

const values = [{
    id: 0,
    name: 'Mike',
    city: 'London'
},
{
    id: 1,
    name: 'Pete',
    city: 'London'
}];

const foos = values.map(a_value => new Foo(a_value)); // Foo[]

相关问题