你好,我想知道是否有可能停止重写类型,使其在编译时保持不可变。
例如,我的意思是让我们创建一个接口
interface freeze{
frozen: boolean;
}和深度冻结功能
function deepFreeze<T>(obj: T) {
var propNames = Object.getOwnPropertyNames(obj);
for (let name of propNames) {
let value = (obj as any)[name];
if (value && typeof value === "object") {
deepFreeze(value);
}
}
return Object.freeze(obj);
}如果我现在做这样的东西
function shouldntWork(): freeze //:freeze is what i want to be blocked as its wrong
{
let mutableFreeze: freeze = { frozen:false}
let immutableFreeze = deepFreeze(mutableFreeze);
return immutableFreeze;
}我知道这不是一个bug,但我想知道是否有某种eslint规则强制不覆盖类型或其他什么,因为我会这样做
function other() {
let something = shouldntWork();
something.frozen = true;
//will crash at runtime but want it to get blocked at compiletime
console.log(something);
}它会崩溃,但如果我没有:freeze,它会推断出正确的只读类型,并在compileTime给出一个错误。
发布于 2021-10-03 14:32:13
您可以使用-> https://github.com/microsoft/TypeScript/issues/13923此处提供的DeepReadOnly
注意不要在shouldntWork上设置返回类型,这样Typescript就可以推断出只读的..
export type primitive = string | number | boolean | undefined | null
export type DeepReadonly<T> =
T extends primitive ? T :
T extends Array<infer U> ? DeepReadonlyArray<U> :
DeepReadonlyObject<T>
export interface DeepReadonlyArray<T> extends ReadonlyArray<DeepReadonly<T>> {}
export type DeepReadonlyObject<T> = {
readonly [P in keyof T]: DeepReadonly<T[P]>
}
interface freeze{
frozen: boolean;
}
let someFreeze: freeze = {frozen: false}
function shouldntWork() {
let tester = deepFreeze(someFreeze);
return tester;
}
function other() {
let something = shouldntWork();
something.frozen = true; //Cannot assign to 'frozen' because it is a read-only property.
console.log(something);
}
function deepFreeze<T>(obj: T):DeepReadonly<T> {
let propNames = Object.getOwnPropertyNames(obj);
for (let name of propNames) {
let value = (obj as any)[name];
if (value && typeof value === "object") {
deepFreeze(value);
}
}
return Object.freeze(obj) as DeepReadonly<T>;
}
other();https://stackoverflow.com/questions/69425636
复制相似问题