我正在try 编写一段代码,该代码将为一个类型的每个成员生成一个有区别的联合,以及一个函数,该函数将接受该类型的对象和一个联合成员的实例.
以下是我到目前为止拥有的代码
interface RickAndMortyCharacter {
species: string;
origin: {
name: string;
url: string;
};
}
type RickAndMortyCharacterChange = {
[Prop in keyof RickAndMortyCharacter]: {
updatedProps: Prop;
newValue: RickAndMortyCharacter[Prop];
};
}[keyof RickAndMortyCharacter];
function applyPropertyChange(
state: RickAndMortyCharacter,
payload: RickAndMortyCharacterChange
) {
// Error on this line
state[payload.updatedProps] = payload.newValue;
return state;
}
也可以在这里与打印稿playground一起使用
TypeScrip显示以下错误
类型‘字符串|{名称:字符串;url:字符串;}’不能分配给类型‘字符串&;{名称:字符串;url:字符串;}’. 类型‘字符串’不可赋值给类型‘字符串&;{名称:字符串;url:字符串;}’. 类型‘字符串’不可赋值给类型‘{name:string;url:string;}’.(2322)
有趣的是,当我将鼠标悬停在RickAndMortyCharacterChange
类型上时,我看到声明了以下类型:
type RickAndMortyCharacterChange = {
updatedProps: "species";
newValue: string;
} | {
updatedProps: "origin";
newValue: {
name: string;
url: string;
};
}
这对我来说似乎是正确的,因为Typescript 阻止了我写这篇文章
const s: RickAndMortyCharacterChange = {
updatedProps: "origin",
newValue: "bonjour"
};
const s2: RickAndMortyCharacterChange = {
updatedProps: "species",
newValue: {
name: "Hello",
url: "Hoi"
}
}
我最近在一个Angular 项目中使用了一个非常非常类似的方法,它工作得很好.我不能理解为什么TypeScrip在这里抱怨