Javascript Typescript不';t尊重;删除“;操作人员

Javascript Typescript不';t尊重;删除“;操作人员,javascript,typescript,Javascript,Typescript,当我使用delete操作符时,Typescript似乎并不“知道”该属性已被删除。例如: interface HasName { name: string; } interface HasNoName { name: never; } function removeName( input: HasName, ): HasNoName { const output = {...input}; delete output.name; return output; // T

当我使用
delete
操作符时,Typescript似乎并不“知道”该属性已被删除。例如:

interface HasName {
  name: string;
}

interface HasNoName {
  name: never;
}

function removeName(
  input: HasName,
): HasNoName {
  const output = {...input};
  delete output.name;
  return output; // This throws an error
}
Typescript拒绝函数,并出现以下错误:

 Type '{ name: string; }' is not assignable to type 'HasNoName'.
  Types of property 'name' are incompatible.
    Type 'string' is not assignable to type 'never'.

按照我的思路,通过删除<代码>名称<代码>属性,Typescript应该考虑<代码>输出>代码>兼容<代码> HasNaMeN<代码>,但情况似乎并非如此。


我可以很容易地解决它,例如,
const nameless=output as HasNoName;返回无名
。但是我想知道为什么会发生这个错误,以及它是错误还是故意的?

问题不在于
delete
操作符,而在于
return
语句如果不匹配(hasName!=hasnaname),则不会将输出“强制转换”为返回类型,以这种方式思考,你需要做出明确的判断并承担风险,比如:

removeName(
    input: HasName,
  ): HasNoName {
    const output = {...input};
    delete output.name;
    return <HasNoName>output;
  }
removeName(
输入:HasName,
):HasNoName{
常量输出={…输入};
删除output.name;
返回输出;
}

我希望它能对您有所帮助。

问题不在于
delete
操作符,而在于
return
语句不会在返回类型不匹配时将输出“转换”为返回类型(hasName!=hasnaname),这样您就需要进行显式转换并承担风险,如:

removeName(
    input: HasName,
  ): HasNoName {
    const output = {...input};
    delete output.name;
    return <HasNoName>output;
  }
removeName(
输入:HasName,
):HasNoName{
常量输出={…输入};
删除output.name;
返回输出;
}

我希望它能帮助您。

避免使用
delete
操作符。相反,请使用对象分解:

接口名称{
名称:字符串;
}
接口HasNoName{
名字?:从不;
}
函数removeName(
输入:HasName,
):HasNoName{
常量{name:,…output}=input;
返回输出;
}

避免使用
delete
运算符。相反,请使用对象分解:

接口名称{
名称:字符串;
}
接口HasNoName{
名字?:从不;
}
函数removeName(
输入:HasName,
):HasNoName{
常量{name:,…output}=input;
返回输出;
}

我的假设是,由于输出是从HasName的数据构造的,因此typescript也将输出关联为HasName。但这只是一个假设我相信这是因为只有当你赋值时才会推断出类型我的假设是,由于输出是从HasName的数据构造的,typescript也将输出关联为HasName。但这只是一个假设,我相信这是因为只有当你赋值时,类型才会被推断出来