опустить дважды вложенное свойство из 'this' - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь добавить метод, который удаляет внутреннее свойство из типа объекта, и из-за сложного базового класса, который я не могу изменить, у меня возникла следующая проблема: я написал метод, который должен отбрасывать приведение свойства (в данном случае name), но свойство ceo.name остается доступным для доступа. Я считаю, что это происходит потому, что добавление типа без свойства имени генерального директора к this просто требует наибольшего знаменателя, то есть {name:string} & {} == {name:string}

есть ли способ решить эту проблему?

class Company {
    ceo: {}
    addCeoNameType() {
        return this as this & {
            ceo: {
                name: string;
            }
        }
    }
    removeCeoNameType() {
        const ceoForType: this['ceo'] = null;
        return this as this & {
            ceo: Omit<typeof ceoForType, 'name'>;
        }
    }
}

class Foo {
    bar() {
        const catsInc = new Company();
        const catsIncWithCeoName = catsInc.addCeoNameType();
        catsIncWithCeoName.ceo.name;
        catsIncWithCeoName.removeCeoNameType().ceo.name;
    }
}

1 Ответ

2 голосов
/ 29 мая 2020

Может и так:

type Ceo = { name: string };

class Company {
    addCeoNameType() {
        return this as this & {
            ceo: Ceo
        }
    }
    removeCeoNameType() {
        return this as unknown as Omit<this, 'ceo'> & { ceo: Omit<Ceo, 'name'> } ;
    }
}

class Foo {
    bar() {
        const catsInc = new Company();
        const catsIncWithCeoName = catsInc.addCeoNameType();
        catsIncWithCeoName.ceo.name;
        catsIncWithCeoName.removeCeoNameType().ceo.name;
                                                // ^ fails here
    }
}
...