Introduction TypeScript’s type system allows you to mark individual properties on interfaces, types and class properties as readonly. Examples interface function foo(config: { readonly bar: number, readonly bas: number}) {// .. } let config = { bar: 123, bas: 123 }; foo(config); // You can be sure that `config` isn't changed 🌹 type type Foo = { readonly bar: number; readonly bas: number; } // Initialization is okay let foo: Foo = { bar: 123, bas: 456 }; // Mutation is not foo.bar = 456; // Error: Left-hand side of assignment expression cannot be a constant or a read-only property class property class Foo { readonly bar = 1; // OK readonly baz: string; constructor() { this.baz = "hello"; // OK } } type Foo = { bar: number; bas: number; } type FooReadonly = Readonly<Foo>; let foo: Foo = {bar: 123, bas: 456}; let fooReadonly: FooReadonly = {bar: 123, bas: 456}; foo.bar = 456; // Okay fooReadonly.bar = 456; // ERROR: bar is readonly