Друг класс в TypeScript
В C++ есть класс подруг. Насколько я знаю, такого нет в TypeScript/JavaScript. Есть ли способ имитировать такое поведение класса друга в TypeScript/JavaScript?
Чтобы лучше понять (если нужно), почему и что я пытаюсь сделать, я делаю небольшую игру для забавы (и для изучения материала) и пытаюсь это сделать. На данный момент я просто использую публичные методы, и все работает, но я хотел бы ограничить доступ этих методов только к одному другому классу. Я использую TypeScript, если это поможет.
2 ответа
TypeScript только обеспечивает protected
а также private
модификаторы доступа. На данный момент не имеет что-то вроде friend
или же internal
,
Чтобы получить аналогичные эффекты: если вы упаковываете свой код как библиотеку и излучаете .d.ts
файлы декларации для него, вы можете использовать /** @internal */
JSDoc аннотация о свойствах, которые вы не хотите использовать посторонними, вместе с указанием --stripInternal
опция компилятора. Это приведет к тому, что экспортированное объявление пропустит эти свойства.
Еще один способ сделать что-то подобное, это придумать interface
который реализует ваш класс, а затем только экспортирует класс как открытый интерфейс. Например:
// public interfaces
export interface UnitStatic {
new(grid: Grid, x: number, y: number): Unit;
}
export interface Unit {
move(x: number, y: number): void;
}
export interface GridStatic {
new(): Grid;
NUM_CELLS: number;
CELL_SIZE: number;
}
export interface Grid {
// public methods on Grid
}
// private implementations
class UnitImpl implements Unit {
constructor(private grid: GridImpl, private x: number, private y: number) {
}
move(x: number, y: number) {
// ...
}
}
class GridImpl implements Grid {
cells: Unit[][] = [];
constructor() {
// ...
}
static NUM_CELLS = 10;
static CELL_SIZE = 20;
}
//public exports
export const Unit: UnitStatic = UnitImpl;
export const Grid: GridStatic = GridImpl;
Это утомительно, но очень ясно показывает, какие части вашего кода предназначены для посторонних, а какие нет.
Или, поскольку ни одно из вышеперечисленного на самом деле не мешает людям получать доступ к частной / внутренней информации в JavaScript во время выполнения, вы можете использовать IIFE, чтобы действительно скрыть эти вещи от посторонних. Это может быть более раздражающим в TypeScript, поскольку, вероятно, вам потребуется создать вышеуказанные открытые интерфейсы для правильной проверки типов.
Так что есть несколько вариантов для вас. Надеюсь, они помогут. Удачи!
Ну, конечно, это было предложено. См. https://github.com/Microsoft/TypeScript/issues/2136.
Но, в конце концов, TypeScript - это не C++ и не Java. Да, TypeScript (и ES6) предоставляют классы, которые выглядят как классы в классическом языке ООП, но на самом деле язык не предназначен для того, чтобы быть полноценным языком ООП со всеми прибамбасами и свистами, а также не должен быть.
Если вам нужны классы друзей, вы должны рассмотреть возможность чрезмерной разработки иерархий классов и размещения слишком большой части логики проектирования в структурах классов, пытаясь превратить JS/TS в язык ООП, которым он никогда не предназначался.,