Свойство Typescript, инициализированное в функции, перезаписывается - PullRequest
0 голосов
/ 04 декабря 2018

Немного предыстории, я перенесу свой исходный код из 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
  }
}

Любая помощь будет очень признательна,

Томер.

1 Ответ

0 голосов
/ 04 декабря 2018

Поскольку вы ориентируетесь на 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, это не сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...