TypeScript 复制对象的属性以创建新对象
TypeScript copy object's properties to create a new object
我想从扩展 'B' 的 'A' 类型的对象创建一个 'B' 类型的新对象。
我试图从类型为 'A' 的对象复制类型为 'B' 的属性,这给了我一个错误。
你能帮我解决这个错误或解释我做错了什么吗?
这是我的代码示例:
interface ThemeMeta {
available: boolean;
tags: string[];
}
const defaultThemeMeta: ThemeMeta = {
available: false,
tags: []
};
interface Theme extends ThemeMeta {
name: string;
domainName: string;
lastUpdate: number;
published: boolean;
developer: boolean;
pinned: boolean;
id: number;
}
const defaultTheme:Theme = {
name: 'Default theme name',
domainName: '',
lastUpdate: 0,
published: false,
developer: false,
pinned: false,
id: 0,
available: false,
tags:[]
};
const theme:Theme = defaultTheme,
themeMeta:ThemeMeta = defaultThemeMeta;
let key: keyof ThemeMeta;
for(key in defaultThemeMeta) {
themeMeta[key] = theme[key];
}
当前类型 key
如果 keyof ThemeMeta
,这意味着 theme[key]
可以是 ThemeMeta
值的任何可用类型。在我们的例子中是 boolean
或 string[]
。所以 keyof ThemeMeta[keyof ThemeMeta]
的类型是 boolean | string
当你将它应用到 themeMeta 的任何特定属性时,你会得到一个错误,因为 boolean
或 string[]
都不能接受类型 boolean | string
的值
您可以做的是:
const theme:Theme = defaultTheme;
let themeMeta:ThemeMeta = defaultThemeMeta;
let key: keyof ThemeMeta;
for(key in defaultThemeMeta) {
themeMeta = {
...themeMeta,
[key]: theme[key]
}
}
我想从扩展 'B' 的 'A' 类型的对象创建一个 'B' 类型的新对象。 我试图从类型为 'A' 的对象复制类型为 'B' 的属性,这给了我一个错误。
你能帮我解决这个错误或解释我做错了什么吗? 这是我的代码示例:
interface ThemeMeta {
available: boolean;
tags: string[];
}
const defaultThemeMeta: ThemeMeta = {
available: false,
tags: []
};
interface Theme extends ThemeMeta {
name: string;
domainName: string;
lastUpdate: number;
published: boolean;
developer: boolean;
pinned: boolean;
id: number;
}
const defaultTheme:Theme = {
name: 'Default theme name',
domainName: '',
lastUpdate: 0,
published: false,
developer: false,
pinned: false,
id: 0,
available: false,
tags:[]
};
const theme:Theme = defaultTheme,
themeMeta:ThemeMeta = defaultThemeMeta;
let key: keyof ThemeMeta;
for(key in defaultThemeMeta) {
themeMeta[key] = theme[key];
}
当前类型 key
如果 keyof ThemeMeta
,这意味着 theme[key]
可以是 ThemeMeta
值的任何可用类型。在我们的例子中是 boolean
或 string[]
。所以 keyof ThemeMeta[keyof ThemeMeta]
的类型是 boolean | string
当你将它应用到 themeMeta 的任何特定属性时,你会得到一个错误,因为 boolean
或 string[]
都不能接受类型 boolean | string
您可以做的是:
const theme:Theme = defaultTheme;
let themeMeta:ThemeMeta = defaultThemeMeta;
let key: keyof ThemeMeta;
for(key in defaultThemeMeta) {
themeMeta = {
...themeMeta,
[key]: theme[key]
}
}