为什么在 typescript4.0 版本规范中添加删除关键字附加规范?

why added delete keyword additional spec in typescript4.0 release spec?

本次typescript v4.0新增delete关键字规范

[规格]

When using the delete operator in strictNullChecks, the operand must now be any, unknown, never, or be optional (in that it contains undefined in the type). 
Otherwise, use of the delete operator is an error.

我不明白为什么要添加此规范。

为什么不能删除特定类型?

我想知道为什么要添加这些规格。

我可以关闭“strictNullChecks”选项,但这似乎不是个好主意。

谢谢。

--- 编辑 ---
[示例]

type UserFromDatabase = {
  name: string;
  password: string;
}

type User = Omit<UserFromDatabase, "password">


const signIn = (): User => {


  const userFromDatabase: UserFromDatabase = getUserFromDatabase();

  // do something
  // compare password ...

  delete userFromDatabase.password; // error occured typescript 4.0

  const user: User = { ...userFromDatabase };

  return user;
}


--- edit2 ---
打字稿版本:v4.0 [新规范 - 删除关键字允许类型]

我知道 javascript 的 delete 关键字是删除对象的 属性 而不是对象。

一些对象键在重要逻辑时可用。

所以,在完成重要逻辑之后,我想删除对象键。

如果你可以删除某些东西,那意味着某些东西可能不存在(尤其是在被删除之后),所以那个东西的类型必须允许non-existence。考虑以下示例:

type T = {
    x: string;
}

let object: T = { x: "a" };
delete object.x;

// this is not supposed to make sense
console.log(object.x.toLowerCase());

事实上,最后一行会在运行时抛出错误。因此,进行更严格的类型检查以防止此类运行时错误是正确的做法。

更新

所以在你的情况下你可以这样做:

delete (userFromDatabase as any).password;
const user: User = userFromDatabase;

或者,正如 Aluan Haddad 指出的,不使用 delete 的更聪明的方法是:

let { password, ...user } = userFromDatabase;
return user;

转换为 Partial 类型以删除其 属性:

type UserFromDatabase = {
  name: string;
  password: string;
}

type User = Omit<UserFromDatabase, "password">

function deletePassword(user: UserFromDatabase): User {
  delete (user as Partial<UserFromDatabase>).password;
  return user;
}