Феномен декораторов TypeScript (параметр декоратора становится неопределенным в особом случае) - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь реализовать свой собственный ORM, и я нашел что-то интересное в TypeScript, чего я не понимаю. Может быть, кто-то из вас может мне это объяснить, или, может быть, это ошибка машинописи.

Вот упрощенная структура basi c, где также присутствует это явление.

У нас есть свойство декоратор, который принимает один параметр типа класса.

// This is not required, only used to define the entityClass type more explicite
export abstract class Entity { }


export function Decorator(entityClass: typeof Entity) {
    return function(target: any, propertyName: string) {
        console.log(entityClass);
    }
}

Файл с классом A: EntityA.ts

import { Entity, Decorator } from "./index";
import { EntityB } from "./EntityB";

export class EntityA extends Entity {

    @Decorator(EntityB)
    public propertyA: any;
}

Файл с классом B: EntityB.ts

import { Entity, Decorator } from "./index";
import { EntityA } from "./EntityA";

export class EntityB extends Entity {

    @Decorator(EntityA)
    public propertyB: any;
}

Немного кода для запуска машинописи, чтобы использовать декоратор для вывода console.log:

run.ts

import { EntityA } from "./EntityA";
import { EntityB } from "./EntityB";


const objA = new EntityA();
const objB = new EntityB();

При запуске этого скрипта я получаю:

undefined
[Function: EntityB]

Это undefined - это явление. Теперь я удаляю в EntityA.ts эту строку @Decorator(EntityB) и снова запускаю скрипт, и undefine исчезает. Вместо этого я получаю ожидаемый результат:

[Function: EntityA]

Я что-то не так понял в декораторах или это ошибка машинописи?

1 Ответ

1 голос
/ 25 апреля 2020

В коде есть циклические ссылки - EntityA зависит от EntityB и наоборот.

При инициализации EntityA, EntityB, переданное в @Decorator(EntityB), равно undefined, поэтому декоратор фиксирует значение 'undefined`.

Во время инициализации EntityB, EntityA уже существует, поэтому кажется, что все работает нормально.

...