typescriptreadonlytranspiler

How to define readonly object parameter for function in Typescript


Is there any way to enforce an object parameter cannot be changed in typescript, e.g.

interface MyType {
   prop1: number
}

function myMethod(param: readonly MyType) {
   // I want TS complain here:
   param.prop1 = 2
}

Solution

  • If you want to prevent any of the object's properties from being modified, you can use the type utility Readonly<Type>, like this:

    TS Playground

    interface MyType {
      prop1: number;
      prop2: number;
    }
    
    function myMethod(param: Readonly<MyType>) {
      param.prop1 = 2; /*
            ~~~~~
      Cannot assign to 'prop1' because it is a read-only property.(2540) */
    
      param.prop2 = 1; /*
            ~~~~~
      Cannot assign to 'prop2' because it is a read-only property.(2540) */
    }
    

    But if you only want to prevent specific properties from being modified, you can mark them as read-only using the readonly modifier:

    TS Playground

    interface MyType {
      readonly prop1: number;
      prop2: number;
    }
    
    function myMethod(param: MyType) {
      param.prop1 = 2; /*
            ~~~~~
      Cannot assign to 'prop1' because it is a read-only property.(2540) */
    
      param.prop2 = 1; // ok
    }