Похоже, вы преувеличиваете. Это нельзя сделать средствами фреймворка, и это нельзя решить средствами JavaScript, так как язык не имеет контроля доступа.
MyService
имеет методы getChore
и passChore
в качестве общедоступного интерфейса, и любой модуль, использующий службу, также может использовать оба метода. Это прекрасно. Если оба контроллера разработаны вами и у вас нет реальных причин ограничивать доступ, применяйте здесь бритву Оккама и не ищите дальше.
Если бы это была разработанная вами библиотека, которая будет использоваться третьей стороной, метод, который не следует использовать извне, можно было бы пометить как «внутренний» и назвать соответствующим образом. AngularJS имеет соглашение ставить перед всеми внутренними вещами префикс $$
.
С другой стороны, TypeScript предназначен для расширения JavaScript с помощью типов и контроля доступа, поэтому его можно решить таким образом, по крайней мере, во время разработки (до того, как исходный код TS был скомпилирован в JS):
interface IWritableFooService {
setFoo();
}
interface IDuplexFooService extends IWritableFooService {
getFoo();
}
class FooService implements IDuplexFooService {
getFoo() {...}
setFoo() {...}
}
Учитывая, что услуга определяется как
app.service('fooService', FooService);
Его можно вводить в одно место с ограничительным типом:
app.controller('BarController', function (fooService: IWritableFooService) {...});
И рассыпным шрифтом в другом:
app.controller('BazController', function (fooService: IDuplexFooService) {...});
Если BarController
попытается использовать fooService.getFoo()
, это приведет к ошибке компиляции TypeScript.
Такой подход является примером чрезмерной инженерии. Даже если был указан правильный интерфейс, никто не может запретить разработчику заменить IWritableFooService
на тип IDuplexFooService
в какой-то момент. Лучшие практики ООП исходят из практических соображений, и, похоже, их нет. Но да, это можно сделать с помощью TypeScript.
person
Estus Flask
schedule
25.04.2017
passChore
. Вы можете создать другую службу с ограниченной функциональностью, которая обертывает эту и не предоставляет методpassChore
... но зачем? - person Estus Flask   schedule 25.04.2017