如何将TypeScript数组转换为类的泛型数组

cngwdvgl  于 2023-02-05  发布在  TypeScript
关注(0)|答案(2)|浏览(211)

我有一个JSON源数组,所有值都是字符串。我试图将它转换为另一个类型化对象数组。我遇到错误。如何正确地编写此代码?谢谢。
错误1:转换类型"{ Id:字符串;公司名称:string;...)[]“转换为类型”Dest“可能是错误的,因为这两种类型都没有与另一种类型充分重叠。如果这是有意的,请先将表达式转换为”unknown“。
错误2:../网格秒分量ts:12:10 -错误TS 2740:类型“Dest”缺少类型“any[]”的以下属性:length、pop、push、concat等26种类型。12公共网格数据:任意[] =目的地;

export const source = [{
    'Id': 'ALFKI',
    'CompanyName': 'Alfreds Futterkiste',
    'DOB': '01/31/2000' // may not exists
}, {
    'Id': 'ANATR',
    'CompanyName': 'Ana Bokov Emparedados y helados',
}, 

export class Dest{
    public Id: string = "";
    public CompanyName: string = "";
    public DOB?: Date
}

export const destination = <Dest>source;  // Error 1.

在Angular 分量中:

public gridData: any[] = destination;  // Error 2.

umuewwlo

umuewwlo1#

您可以将构造函数添加到类中,并使用map创建它的示例:

class Dest {
    public Id: string = "";
    public CompanyName: string = "";
    public DOB?: Date;

    constructor(id: string, companyName: string, dob: string | undefined) {
        this.Id = id;
        this.CompanyName = companyName;

        // TODO: not seeing Timezone in source objects.
        this.DOB = dob ? new Date(dob): undefined;
    }
}

const destination: Dest[] = source.map(x => new Dest(x.Id, x.CompanyName, x.DOB));

如果你真的不需要一个类,也不想玩new-你可以使用接口或类型,但无论如何,你需要将字符串DOB转换为日期DOB:

interface IDest {
    Id: string;
    CompanyName: string;
    DOB?: Date;
}

const destination: IDest[] = source.map(x => ({...x, DOB: x.DOB ? new Date(x.DOB) : undefined}));

Playground:单击

ekqde3dh

ekqde3dh2#

我喜欢使用Object.assign()来实现这个目的,通常我在RXJS Map中这样做,作为从服务器获取数据的一部分。
但是,您也可以使用array map函数:

newSource = source.map(element => Object.assign(new Dest(),  element));

尽管如此,根据您的代码,对于硬编码数组,我可能会直接创建值作为数组创建的一部分,而不是稍后处理它:

export const source = [Object.assign(new Dest, {
    'Id': 'ALFKI',
    'CompanyName': 'Alfreds Futterkiste',
    'DOB': '01/31/2000' // may not exists
}), Object.assign(new Dest, {
    'Id': 'ANATR',
    'CompanyName': 'Ana Bokov Emparedados y helados',
})
]

相关问题