簡體   English   中英

TypeError:“名稱”是只讀的

[英]TypeError: “name” is read-only

我試圖在一個Sharepoint Framework小示例中實現原型模式,我從這里獲取了示例:

https://mertarauh.com/tutorials/typescript-design-patterns/prototype-pattern/

並修改如下:

 class Employee  {

    private totalperMonth: number;


    constructor(public name: string, public hiredDate: Date, public dailyRate: number){
        this.totalperMonth = dailyRate * 20 ;
    }

    public display(): string{
        return "Employee " + this.name + " earns per month: " + this.totalperMonth;
    }

    public clone():Employee{
        var cloned = Object.create(Employee || null);
        Object.keys(this).map((key: string) => {
            cloned[key]= this[key];
        });
        return <Employee>cloned;
    }
}

export default Employee;

和組件

import * as React from 'react';
import styles from './Prototype.module.scss';
import { IPrototypeProps } from './IPrototypeProps';
import { escape } from '@microsoft/sp-lodash-subset';
import  Employee from './Employee';


export default class Prototype extends React.Component<IPrototypeProps, {}> {


  public render(): React.ReactElement<IPrototypeProps> {
    const today = new Date();
    let employee1: Employee = new Employee('Luis', today, 500);
    let employee2 = employee1.clone();
    employee2.dailyRate = 550;

    return (
      <div className={ styles.prototype }>
        <div className={ styles.container }>
          <div className={ styles.row }>
            <div className={ styles.column }>
              <span className={ styles.title }>Welcome to SharePoint!</span>
              <p className={ styles.subTitle }>Customize SharePoint experiences using Web Parts.</p>
              <p className={ styles.description }>{escape(this.props.description)}</p>
                <span className={ styles.label }>{employee1.display()}</span>
                <span className={ styles.label }>{employee2.display()}</span>
            </div>
          </div>
        </div>
      </div>
    );
  }
}

但是我在控制台中遇到此錯誤:

我想念什么?

在此處輸入圖片說明

這種方法存在幾個問題。

在TypeScript中,類是一等公民,繼承的替代方法可以使類型安全性變得不那么直接。

Object.create是低級工具,除非您知道自己在做什么以及為什么這么做,否則不要使用它。 此處的實際錯誤是選擇了錯誤的原型( Employee而不是Employee.prototype ),因此name屬性指向函數name屬性 ,該屬性是只讀的,不應重新分配。 實現clone正確方法是:

public clone():Employee{
    return Object.assign(Object.create(Employee.prototype), this);
}

它忽略類構造函數的事實是一個令人懷疑的決定,因為構造函數可能包含與clone應用的邏輯不同的邏輯。

React促進了函數式編程來代替OOP,將應用程序狀態保持為純對象而不是類實例是有益的,這可能有助於避免設計上的缺陷,而這些缺陷在將來將很昂貴。 在這種情況下,沒有什么真正需要一個類的。 同一件事可以表示為:

const createEmployee = (name, hiredDate, dailyRate) => ({
 name,
 hiredDate,
 dailyRate,
 totalperMonth: dailyRate * 20
});

...

let employee1 = createEmployee('Luis', today, 500);
let employee2 = {...employee1, dailyRate: 550};

請注意, totalperMonth即不是重新計算Employee類也不createEmployee工廠函數。 這可能是不可取的(請參見上面有關構造函數的注釋)。

ReactJs - 類型錯誤:無法分配給 object 的只讀屬性“名稱”'#<object> '<div id="text_translate"><p> 我有一個對象數組:</p><pre> var subcategories = [{name:'gloves', tag:'wool'}, {name:'boots', tag: 'leather'}]</pre><p> 我只想找到 object 的索引來更改名稱或標簽。 我用這個 function:</p><pre> function setSubcat(val, index, lang){ var newArr = [] var obj = { 'name': val } subcategories.map((val, i)=>{ if(index === i){ var newObj = Object.assign(val, obj) newArr.push(newObj) } newArr.push(val) }) setSubcategories(newArr) }</pre><p> 錯誤發生在var newObj = Object.assign(val, obj)</p><p> 我認為這個錯誤意味着我不能直接改變 state,所以我必須復制一份。 我認為通過subcategories映射並將其推送到本地newArr意味着我制作了數組的副本。 但是當我想在其中更改 object 的值時它不起作用,所以我使用了 Object.assign,我認為它會從數組中深度復制特定的 object,但它也不起作用。</p><p> 我在這里錯過了什么?</p></div></object>

[英]ReactJs - TypeError: Cannot assign to read only property 'name' of object '#<Object>'

ReactJs 類型錯誤:無法分配給 object 的只讀屬性“名稱”'#<object> '<div id="text_translate"><p> 我正在嘗試更改輸入的名稱屬性,因為我的組件的 state 發生了變化。<br> 簡而言之,這就是我想要做的。</p><pre> let displayInputElement = ( &lt;input type="text" name = {pips} placeholder="Type your answer here" className=" form-control" /&gt; ); displayInputElement.props.name = "chicken";</pre><p> 但我收到以下錯誤</p><blockquote><p>類型錯誤:無法分配給 object '#' 的只讀屬性“名稱”</p></blockquote><p> 請我如何在反應中實現以下目標</p><pre>displayInputElement.props.name = "chicken"; let pips = displayInputElement.props.name; displayInputElement = ( &lt;input type="text" name = "chicken" placeholder="Type your answer here" className=" form-control" /&gt; );</pre></div></object>

[英]ReactJs TypeError: Cannot assign to read only property 'name' of object '#<Object>'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

相關問題 類型錯誤:Object.key 是只讀的 添加/刪除React Grid布局示例:TypeError:“ exports”為只讀 ReactJs - 類型錯誤:無法分配給 object 的只讀屬性“名稱”'#<object> '<div id="text_translate"><p> 我有一個對象數組:</p><pre> var subcategories = [{name:'gloves', tag:'wool'}, {name:'boots', tag: 'leather'}]</pre><p> 我只想找到 object 的索引來更改名稱或標簽。 我用這個 function:</p><pre> function setSubcat(val, index, lang){ var newArr = [] var obj = { 'name': val } subcategories.map((val, i)=>{ if(index === i){ var newObj = Object.assign(val, obj) newArr.push(newObj) } newArr.push(val) }) setSubcategories(newArr) }</pre><p> 錯誤發生在var newObj = Object.assign(val, obj)</p><p> 我認為這個錯誤意味着我不能直接改變 state,所以我必須復制一份。 我認為通過subcategories映射並將其推送到本地newArr意味着我制作了數組的副本。 但是當我想在其中更改 object 的值時它不起作用,所以我使用了 Object.assign,我認為它會從數組中深度復制特定的 object,但它也不起作用。</p><p> 我在這里錯過了什么?</p></div></object> ReactJs 類型錯誤:無法分配給 object 的只讀屬性“名稱”'#<object> '<div id="text_translate"><p> 我正在嘗試更改輸入的名稱屬性,因為我的組件的 state 發生了變化。<br> 簡而言之,這就是我想要做的。</p><pre> let displayInputElement = ( &lt;input type="text" name = {pips} placeholder="Type your answer here" className=" form-control" /&gt; ); displayInputElement.props.name = "chicken";</pre><p> 但我收到以下錯誤</p><blockquote><p>類型錯誤:無法分配給 object '#' 的只讀屬性“名稱”</p></blockquote><p> 請我如何在反應中實現以下目標</p><pre>displayInputElement.props.name = "chicken"; let pips = displayInputElement.props.name; displayInputElement = ( &lt;input type="text" name = "chicken" placeholder="Type your answer here" className=" form-control" /&gt; );</pre></div></object> “ babel”對於react jsx是只讀的 如何在React中實現只讀字段? 無法分配給 object 的只讀屬性 將 React 中的 Monaco Editor 設置為只讀 只讀輸入的千位分隔符 如何模擬 Jest 中的只讀屬性?
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM