Readonly
Implement the built-in Readonly<T> generic without using it.
Constructs a type with all properties of T set to readonly, meaning the properties of the constructed type cannot be reassigned.
For example:
tsinterfaceTodo {title : stringdescription : string}constCannot find name 'MyReadonly'. Did you mean 'Readonly'?2552Cannot find name 'MyReadonly'. Did you mean 'Readonly'?todo :< MyReadonly Todo > = {title : "Hey",description : "foobar"}todo .title = "Hello" // Error: cannot reassign a readonly propertytodo .description = "barFoo" // Error: cannot reassign a readonly property
tsinterfaceTodo {title : stringdescription : string}constCannot find name 'MyReadonly'. Did you mean 'Readonly'?2552Cannot find name 'MyReadonly'. Did you mean 'Readonly'?todo :> = { MyReadonly <Todo title : "Hey",description : "foobar"}todo .title = "Hello" // Error: cannot reassign a readonly propertytodo .description = "barFoo" // Error: cannot reassign a readonly property
Solution ✅
tsinterfaceTodo {title : stringdescription : string}typeMyReadonly <T > = {readonly [P in keyofT ]:T [P ]}consttodo :MyReadonly <Todo > = {title : "Hey",description : "foobar"}Cannot assign to 'title' because it is a read-only property.2540Cannot assign to 'title' because it is a read-only property.todo .= "Hello" title Cannot assign to 'description' because it is a read-only property.2540Cannot assign to 'description' because it is a read-only property.todo .= "barFoo" description
tsinterfaceTodo {title : stringdescription : string}typeMyReadonly <T > = {readonly [P in keyofT ]:T [P ]}consttodo :MyReadonly <Todo > = {title : "Hey",description : "foobar"}Cannot assign to 'title' because it is a read-only property.2540Cannot assign to 'title' because it is a read-only property.todo .= "Hello" title Cannot assign to 'description' because it is a read-only property.2540Cannot assign to 'description' because it is a read-only property.todo .= "barFoo" description