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?
