There's a way:
type Writeable<T extends { [x: string]: any }, K extends string> = {
[P in K]: T[P];
}
(code in playground)
But you can go the opposite way and it will make things much easier:
interface Foo {
bar: boolean;
}
type ReadonlyFoo = Readonly<Foo>;
let baz: Foo;
baz.bar = true; // fine
(baz as ReadonlyFoo).bar = true; // error
(code in playground)
Update
Since typescript 2.8 there's a new way to do it:
type Writeable<T> = { -readonly [P in keyof T]: T[P] };
If you need your type to be writeable recursively, then:
type DeepWriteable<T> = { -readonly [P in keyof T]: DeepWriteable<T[P]> };
These type
definitions are called mapped types
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…