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];
}

Playground Link

当前类型 key 如果 keyof ThemeMeta,这意味着 theme[key] 可以是 ThemeMeta 值的任何可用类型。在我们的例子中是 booleanstring[]。所以 keyof ThemeMeta[keyof ThemeMeta] 的类型是 boolean | string

当你将它应用到 themeMeta 的任何特定属性时,你会得到一个错误,因为 booleanstring[] 都不能接受类型 boolean | string

的值

您可以做的是:

const theme:Theme = defaultTheme;
let themeMeta:ThemeMeta = defaultThemeMeta;
let key: keyof ThemeMeta;
for(key in defaultThemeMeta) {
    themeMeta = {
        ...themeMeta,
        [key]: theme[key]
    }
}