Javascript 错误背后的逻辑是什么?a';删除';运算符必须是可选的typescript 4.0

Javascript 错误背后的逻辑是什么?a';删除';运算符必须是可选的typescript 4.0,javascript,typescript,Javascript,Typescript,这是typescript代码中出现的新错误 我无法理解其背后的逻辑 我无法理解其背后的逻辑 我所理解的逻辑如下: InterfaceThing是一个要求将(非空、非未定义的)prop作为字符串的契约 如果删除了该属性,则该合同将不再执行 如果您希望它在删除时仍然有效,只需使用?:prop?:字符串将其声明为可选 事实上,我很惊讶这并没有在早期版本的TypeScript中导致错误。这背后的逻辑是,您需要使用如下可选属性实现接口: interface Thing { prop?: string

这是typescript代码中出现的新错误

我无法理解其背后的逻辑

我无法理解其背后的逻辑

我所理解的逻辑如下:

Interface
Thing
是一个要求将(非空、非未定义的)
prop
作为
字符串的契约

如果删除了该属性,则该合同将不再执行

如果您希望它在删除时仍然有效,只需使用
prop?:字符串将其声明为可选


事实上,我很惊讶这并没有在早期版本的TypeScript中导致错误。

这背后的逻辑是,您需要使用如下可选属性实现接口:

interface Thing {
  prop?: string;
}

function f(x: Thing) {
  delete x.prop; 
}

因此,接口的契约不会被打破。

如果您希望它存在,请使用另一个实现:

interface Thing {
  prop: string;
}
interface PropoptionalThing {
  prop?: string;
}

function f(x: Thing): PropoptionalThing {
  let tmp: PropoptionalThing = x;
  delete tmp.prop;
  return tmp;
}

你的问题包括答案
在strictNullChecks中使用delete运算符时,操作数现在必须为any、unknown、never或可选
如果使用React并希望将道具传递给组件,则这是误报,但不希望将所有的道具传递给HTMLDOM元素,因为它们无效,并且您正在使用扩展运算符来允许使用者传递所有本机HTML属性。然后复制道具并删除不必要的道具。
interface Thing {
  prop: string;
}
interface PropoptionalThing {
  prop?: string;
}

function f(x: Thing): PropoptionalThing {
  let tmp: PropoptionalThing = x;
  delete tmp.prop;
  return tmp;
}