首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Typescript中强制不变的返回

在Typescript中强制不变的返回
EN

Stack Overflow用户
提问于 2021-10-03 14:12:03
回答 1查看 48关注 0票数 0

你好,我想知道是否有可能停止重写类型,使其在编译时保持不可变。

例如,我的意思是让我们创建一个接口

代码语言:javascript
复制
interface freeze{
  frozen: boolean;
}

和深度冻结功能

代码语言:javascript
复制
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);
}

如果我现在做这样的东西

代码语言:javascript
复制
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规则强制不覆盖类型或其他什么,因为我会这样做

代码语言:javascript
复制
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给出一个错误。

这是Typescript游乐场https://www.typescriptlang.org/play?noImplicitOverride=true#code/JYOwLgpgTgZghgYwgAhlCEBeEDeBYAKGVSgHtsQAuZAI1NIBsI4QBuQgX0MKbGQGdSAWwgAxdFgjU0GbMgC8yHGnIQqqOA34QuBQjACuIBGGCkQAgBakDDACbgA6qSgBrABQBKSjMlLCxAHIvMiQ-JBQCsh2GAAO4rIQ7oIiCZKerMhB6GAGUBZhEewEuvpGJmYWpGCW0F7E+ETBEHwpLZagAOZR-Na2DmDObl7FxG01XQB0KhRRYFAGEKPIAPQrAO7ADAzICFBwvchwfAvgwCK0BnzrLHzAfGCkyJ0ttAykCK4Qdkd8CMKxLYtc4QILEf4gQRMSbvTrJYTtLoZTjcPQEQzGUzmaJxNLYAA8ABUAHzuUg0ABW1EJnn8TRCsTIsQAcnARPwogB5SkQEyTF5gTnrEAABSZ0DAAE9WeyyZTkU0YC5kO4QiA2ShSDBkIzSCyNfxaY1iMQQgA3TSLKJyilHDksSWeADa6pEAF1lsRgNr3BaGFaAGQB0KS2IQLXIP1W+Qx5AAInJFN5YDjRrBJpiEHiEmwvstEAVJuQumIJeQOTyFm5Sb5vlziYVpQI1VqUBGQA

EN

回答 1

Stack Overflow用户

发布于 2021-10-03 14:32:13

您可以使用-> https://github.com/microsoft/TypeScript/issues/13923此处提供的DeepReadOnly

示例-> https://www.typescriptlang.org/play?exactOptionalPropertyTypes=true#code/KYDwDg9gTgLgBDAnmYcxQJYFsMwwN1QF44BnGTAOwHM4AfOSgVywCNgp65WIIAbYAENKXJpQAmwAGYZKwcV2Z8+AWABQoSLATJUAEWDAwAJSHiIlPogA8AFQB8cIurhxbcUDGATSaTDjxCOAB+NzgALhcwz29xXwBBKChBG1kpDjgAVUdQgyNTQXNLRETkm2yIqLyTMwsrAHlWACtgAGMYO3t1TWh4WS8oKUFW-UMawrqSpJTOjxAvHzgCoqtSmerlyc7HAG8AX27wXp0UOA3a4saW9tmSHaioC6s4AG0ABThZOABrYEQIKRuAC64TOY02xTs7yBXTUBzU6kRan6HCGIzgUkewAAXsB7mpXJiILjKKCePwhJQANzqeHqATwUgQLDAABiWNxoMxhlxTjgOyJJK5gj4pGAdLUUjE7QwFjIAAsIEw+OJKDAAOrQb4ACgAlPyogyEMByBkSJIjOyecBtUyWVaccBdVS4A9gDAmFARF5TVAaXCkVLKDK5RAYPKOHrXPjXEa7e75bJaCRSIrlaqNVq9f7XPHw0mAHSC7x8ihMYAuuAAeirAGFhJQw3BBKRSBhqN6IHAAOTFyjd7htQRMMWfPq+QRwR6FAC0kz8EBQsEQBairQsTIEBb4EGotuZCaTztpgeleDlFrADtxnW1EGaoNsuvC5wmkIcBoJcCN6EXADlBBZXwSCuNoYALah3XqAB3Sg3igRcOCQACgLvZpjy-KRoDgbUjUoQDUABBcwBQk19RjVxv3dOB8BFcs+TQppmwnShEF1F58JZIEc0ojBAW1Wi+HogAyYSTmAIjBPoogZLgAAie9rhgOTyKiSi4Eva8bSkp0eNceF9LdD0vTgUD2iLDkbUU-UWzBfInhsBx-QlMMIygbMgA

注意不要在shouldntWork上设置返回类型,这样Typescript就可以推断出只读的..

代码语言:javascript
复制
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();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69425636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档