typescript如何仅将属性和方法从接口复制到新对象?

时间:2019-07-08 09:39:47

标签: javascript typescript

我知道在javascript中,我可以使用Object.assign()将字段从一个对象复制到另一个对象。

但是,我想做的是仅在此界面中获取属性:

export interface SizeOption {
    width: number;
    height: number;
    unit: SizeUnit;
    dpi?: number;
}

使用assign没有帮助,因为我有getter和setter方法,我不仅需要获取支持字段。

Object.create()可以同时获取字段和方法,但是我更愿意仅从界面中获取内容

2 个答案:

答案 0 :(得分:3)

Typescript接口仅在编译时存在。您无法在运行时使用它们,必须手动指定要复制到其中的属性:

function pick<T, K extends keyof T>(obj: T, ...keys: K[]): Pick<T, K> {
    const result = {};
    for(const key of keys) result[key] = obj[key];
    return result;
}

const result = pick(sizeOption, "weight", "height", "unit");

答案 1 :(得分:1)

通过使用解构,您只能从更通用的数据对象中提取所需的属性:

interface SizeOption {
    width: number
    height: number
    dpi?: number
}

interface JSONData {
    colors?:string
    width:number
    height:number
    dpi?:number
    title:string
    source:string
}

// data from json has some unwanted properties
const data : JSONData = {
    colors:"black",
    height:300,
    title:"help",
    source:"img.jpg",
    dpi:140,
    width:400
}

// get only width height dpi from json
const {width, height, dpi} = data

// create sizeoption object
const size:SizeOption = {width, height, dpi}

console.log(size)

顺便说一下,您的用例并不十分清楚。如果您想要deep clone,为什么不使用class