我正在学习excellent docs的Typescript ,在练习Mapped Types的时候,我遇到了这个错误.
我知道为什么会发生这个错误(解释如下),但由于我是TS的新手,我不知道修复它的推荐方法.
代码如下(下面是the link to the code playground个代码):
// Represents schema of a Db table
type User = {
id: number; // might be auto incremented by DB
name: string; // contains textual name data
};
// Manual work. Define a type that represents schema of "User" and add some metadata
type DBFields = {
id: { format: "incrementing" };
name: { type: string; pii: true };
};
type ExtractPII<Type> = {
[Property in keyof Type]: Type[Property] extends { pii: true } ? true : false;
};
type ObjectsNeedingGDPRDeletion = ExtractPII<DBFields>;
// Manual work. Create object of ObjectsNeedingGDPRDeletion type
let deletionMarkers: ObjectsNeedingGDPRDeletion = {
id: false,
name: true
};
function handleGDPRDeletionRequest(user: User, deletionMarkers: ObjectsNeedingGDPRDeletion) {
let cleanedUser: Partial<User> = {};
for (const field of Object.keys(user)) {
if (!deletionMarkers[field as keyof User]) {
cleanedUser[field as keyof User] = user[field as keyof User];
}
}
console.log(cleanedUser); // Prints: { id: 1 }
}
let user = {
id: 1,
name: "John Doe",
};
handleGDPRDeletionRequest(user, deletionMarkers); // { id: 1 }
**Please correct me if this explanation is not accurate**
错误发生在线路上
cleanedUser[field as keyof User] = user[field as keyof User];
因为cleanedUser
被宣布为Partial<User>
.Partial<User>
意味着User
的所有属性都是可选的,并且可能是undefined
.
当我们试图将user[field as keyof User]
赋值给这undefined
个可能的属性时,TypeScrip抛出这个错误.
我试着询问了ChatGPT和BingAI,他们提出了一些老生常谈的解决方案,比如将cleanedUser
声明为any
,这是我不想做的.
所以我转向SO寻求适当的解决方案.