Друг класс в 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 в язык ООП, которым он никогда не предназначался.,

Другие вопросы по тегам