TypeScript - Readonly<T> 的可变性和反转
TypeScript - Mutability and inversion of Readonly<T>
假设我有以下可变 class:
class Foo {
constructor(public bar: any) { }
}
我可以像这样定义 class 的 readonly
个实例:
const foo: Readonly<Foo> = new Foo(123);
foo.bar = 456; // error, can't reassign to bar because it's readonly.
我想做的是与此相反,其中 class 是不可变的:
class Foo {
constructor(public readonly bar: any) { }
}
然后能够像这样制作可变版本:
const foo: Mutable<Foo> = new Foo(123);
foo.bar = 456;
这可能吗?
是的,您可以在类型定义中使用 -readonly
。
type Mutable<T> = {
-readonly [P in keyof T]: T[P];
};
const foo: Mutable<Foo> = new Foo(123);
foo.bar = 456;
但记住这只是类型定义,它不会改变原来的逻辑。
type Mutable<T> = {
-readonly [P in keyof T]: T[P];
};
class Foo {
get test(): boolean {
return true;
}
constructor(public readonly bar: any) { }
}
const foo: Mutable<Foo> = new Foo(123);
foo.bar = 456;
foo.test = false; // oops, it will cause an error.
假设我有以下可变 class:
class Foo {
constructor(public bar: any) { }
}
我可以像这样定义 class 的 readonly
个实例:
const foo: Readonly<Foo> = new Foo(123);
foo.bar = 456; // error, can't reassign to bar because it's readonly.
我想做的是与此相反,其中 class 是不可变的:
class Foo {
constructor(public readonly bar: any) { }
}
然后能够像这样制作可变版本:
const foo: Mutable<Foo> = new Foo(123);
foo.bar = 456;
这可能吗?
是的,您可以在类型定义中使用 -readonly
。
type Mutable<T> = {
-readonly [P in keyof T]: T[P];
};
const foo: Mutable<Foo> = new Foo(123);
foo.bar = 456;
但记住这只是类型定义,它不会改变原来的逻辑。
type Mutable<T> = {
-readonly [P in keyof T]: T[P];
};
class Foo {
get test(): boolean {
return true;
}
constructor(public readonly bar: any) { }
}
const foo: Mutable<Foo> = new Foo(123);
foo.bar = 456;
foo.test = false; // oops, it will cause an error.