javascript - typescript hur man kopierar endast egenskaper och metoder från ett interface till ett nytt objekt?


Jag vet att i JavaScript kan jag kopiera fälten från ett objekt till ett annat objekt med hjälp av Object.assign().

Men det jag vill göra är att bara ta egenskaperna här i det här gränssnittet:

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

att använda assign hjälper inte eftersom jag har getters och setters jag behöver ta tag i, inte bara backing-fälten.

Object.create() hämtar både fält och metoder, men jag skulle föredra att bara hämta saker från gränssnittet

Svar #1

Typescript-gränssnitt existerar endast vid kompilering. Du kan inte använda dem vid körning, du måste manuellt ange de egenskaper som ska kopieras där:

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");

Svar #2

Du kan extrahera endast de egenskaper som du vill ha från ett mer generiskt dataobjekt genom att använda destrukturering:

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)

Förresten är ditt användningsfall inte helt klart. Om du vill ha en djupt kopia, varför inte använda en klass?

Relaterade artiklar