Reactjs 为什么readonly关键字没有';我不能进行分解

Reactjs 为什么readonly关键字没有';我不能进行分解,reactjs,typescript,Reactjs,Typescript,我尝试使用react 16.8和typescipt 3.4.5创建带有不可变道具的react组件 在这种情况下,typescript会抛出一个错误 interface IProps { readonly user: {name: string} } const User = (props: IProps) => { props.user = {name: "Foo"} return <>props.user.name</>; }; 但当我对道具使用

我尝试使用react 16.8和typescipt 3.4.5创建带有不可变道具的react组件

在这种情况下,typescript会抛出一个错误

interface IProps {
  readonly user: {name: string}
}

const User = (props: IProps) => {
  props.user = {name: "Foo"}
  return <>props.user.name</>;
};

但当我对道具使用解构时,typescript允许修改道具:

interface IProps {
  readonly user: {name: string}
}

const User = ({user}: IProps) => {
  user = {name: "Foo"}
  return <>user.name</>;
};
接口IProps{
只读用户:{name:string}
}
常量用户=({User}:IProps)=>{
user={name:“Foo”}
返回user.name;
};

我希望typescript在这两种情况下都会抛出错误。

欢迎使用堆栈溢出

我不确定typescript,但在ES6中,当您使用常量保护变量时,如下所示:

const x={name:“John”}

此代码将给出一个错误:

x={name:“Mikkel”}

但这不会:

x.name=“mikkel”


它所能保护的只是
x
被覆盖,而不是对象的内部。我怀疑typescript正在执行相同的操作

只读
属性可以初始化:

  • 在声明的站点(在ES6中镜像
    const

  • 在类的构造函数中

在此代码中

const User = (props: IProps) => {
  props.user = {name: "Foo"}
  return <>props.user.name</>;
};
const User = ({user}: IProps) => {
  user = {name: "Foo"}
  return <>user.name</>;
};

属性
user
(不在大括号内)与接口无关,因为
user
本身没有实现它。接受实现接口的参数的函数本身并不实现此接口。

我认为在第二种情况下,您是从props派生变量并将其称为user。您可以编辑它,但它永远不会更改实际的道具对象。
const User = ({user}: IProps) => {
  user = {name: "Foo"}
  return <>user.name</>;
};