【问题标题】:Typescript inherited property initialized in a function is overwritten在函数中初始化的 Typescript 继承属性被覆盖
【发布时间】:2019-05-05 22:30:20
【问题描述】:

一点背景知识,我正在将我的源代码从 Create React App 迁移到 Next.JS 并且 TypeScript 的编译方式不同。

看这个例子:

abstract class Parent {
  constructor(val: any) {
    this.init(val);
  }

  abstract init(val: any);
}

class Child extends Parent {
  foo: string;

  constructor(val: string) {
    super(val);
  }

  init(val: any) {
    this.foo = val;
  }
}

const i = new Child('test');
console.log(i.foo);

我希望 console.log 打印 test 但相反,它会打印 undefined(在 TypeScript Playground 中尝试过并按预期工作)。

问题是我不确定是哪个配置导致了这种奇怪的行为,我的第一个嫌疑人是 tsconfig --> strictPropertyInitialization 试图将其设置为 false 但没有任何改变。

这是我的tsconfig.json

{
  "compilerOptions": {
    "target": "esnext",
    "module": "esnext",
    "jsx": "preserve",
    "lib": [
      "es5",
      "es6",
      "dom",
      "es2015",
      "es2017"
    ],
    "moduleResolution": "node",
    "allowJs": true,
    "noEmit": true,
    "allowSyntheticDefaultImports": true,
    "skipLibCheck": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "removeComments": false,
    "preserveConstEnums": true,
    "sourceMap": true,
    "forceConsistentCasingInFileNames": true,
    "noImplicitReturns": true,
    "noImplicitThis": true,
    "noImplicitAny": true,
    "strictNullChecks": true,
    "experimentalDecorators": true,
    "strictPropertyInitialization": false
  }
}

非常感谢任何帮助,

汤姆。

【问题讨论】:

    标签: javascript typescript webpack create-react-app next.js


    【解决方案1】:

    因为您的目标是 ESNext,所以 JavaScript 输出将类似于以下示例,在现代浏览器中输出“test”。

    class Parent {
        constructor(val) {
            this.init(val);
        }
    }
    class Child extends Parent {
        constructor(val) {
            super(val);
        }
        init(val) {
            this.foo = val;
        }
    }
    const i = new Child('test');
    console.log(i.foo);

    如果您尝试在不支持 ECMAScript 类语法的旧运行时中运行它,这将不起作用。

    【讨论】:

    • 你确定吗?我在操场上试过,它似乎工作:
    • @TitianCernicova-Dragomir - 这就是我要说的。如果您点击“运行代码 sn-p”(并且没有使用疯狂的浏览器!),它就可以在这个页面上运行!
    • 哦,我的错,我虽然你说它只有在你以 esnext 为目标时才有效。
    • @TitianCernicova-Dragomir - 我把那句话清理了一点,以便更清楚!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    • 2013-01-11
    相关资源
    最近更新 更多