Typescript динамически видимые методы класса - PullRequest
0 голосов
/ 07 января 2020

Есть идеи, как создать динамически видимые методы класса?

class Foo {
   method1() {}
   method2() {}
}

Иногда мне нужно видеть только метод1, иногда оба.

Одним из возможных решений может быть что-то вроде этого, только проблема то, что метод тогда для хинтера виден как "свойство". Это всего лишь маленькая деталь, но в любом случае я хотел, если это действительно метод.

1007 *https://www.typescriptlang.org/play/?ssl=1&ssc=1&pln=10&pc=12#code / MYGwhgzhAEBiD29oG8BQ0PQgFzNglsNALZgDWApgDwDy0FAHthQHYAmM8ARgFYXDYAfAAp4AfgBc0GgEopCJADJpKdJnUAnCtgCuGltBYUA7nETCZ0SFZYBPANxqMAXyfQADhvjMBFNiW0AC3g2AEZhMCkcDXwWAHNLZGhXTGIgkIAmCxRXV1RgeBYcaAAzaABeM3gAOlJKYWQ07GCwqQByNucZVBLa9LCLIA

1 Ответ

3 голосов
/ 07 января 2020

Во-первых: видимость проверяется только во время компиляции, поэтому имейте в виду, что нет способа выдать ошибку во время выполнения, если вы хотите заблокировать доступ к методу. Если это ваш вариант использования, попробуйте что-нибудь другое.

Если вы хотите проверить во время компиляции, то, что вам действительно нужно, это лучшие типы.

Итак, у вас есть класс Foo:

class Foo {
   method1() {}
   method2() {}
}

Если в некоторых частях вашего кода вы не хотите, чтобы вызывался method1, это просто означает, что вам нужно определить type или interface, который не есть такой метод.

type FooMethod2Only {
   method2: () => void;
}

method1 невидимость в некоторых контекстах действительно означает, что вы работаете с типом, у которого нет этого метода.

Так что если вы используете функция как таковая:

function doSomething(foo: FooMethod2Only) {
  foo.method1();
}
doSomething(new Foo());

Тогда машинопись будет жаловаться, потому что, несмотря на то, что Foo имеет method1, тип аргумента не имеет его.

Поэтому вместо того, чтобы думать об этом в свойстве / видимость метода, думайте об этом как об использовании разных типов / интерфейсов для разных целей.

...