Что эквивалентно Dart 2 для `typeof` TypeScript? - PullRequest
0 голосов
/ 02 мая 2020

Я новичок в Dart 2. Я хочу, чтобы у класса было свойство. Это ссылка другого класса. это не экземпляр, а сам класс. В TypeScript можно написать, как показано ниже. Есть ли такой же способ в Dart 2?

class Item { }

class ItemList {
    itemClass: typeof Item;
}

const itemList = new ItemList();
itemList.itemClass = Item;

ОБНОВЛЕНО:
Я добавил еще немного контекста. Ниже приведен минимальный пример кода. Я хочу передать роль создания экземпляра суперклассу.

class RecordBase {
    id = Math.random();
    toJson() {
        return { "id": this.id };
    };
}

class DbBase {
    recordClass: typeof RecordBase;
    create() {
        const record = new this.recordClass();
        const json = record.toJson();
        console.log(json);
    }
}

class CategoryRecord extends RecordBase {
    toJson() {
        return { "category": "xxxx", ...super.toJson() };
    };
}

class TagRecord extends RecordBase {
    toJson() {
        return { "tag": "yyyy", ...super.toJson() };
    };
}

class CategoryDb extends DbBase {
    recordClass = CategoryRecord;
}

class TagDb extends DbBase {
    recordClass = TagRecord;
}

const categoryDb = new CategoryDb();
categoryDb.create();

const tagDb = new TagDb();
tagDb.create();

1 Ответ

1 голос
/ 02 мая 2020

Я пытался сделать из вас пример кода в Dart. Как я уже говорил, вы не можете получить ссылку на класс и вызвать конструктор во время выполнения на основе этой ссылки.

Но вы можете сделать ссылку на метод, который создает объект вашего класса.

import 'dart:math';

class RecordBase {
  static final Random _rnd = Random();

  final int id = _rnd.nextInt(100000);

  Map<String, dynamic> toJson() => <String, dynamic>{'id': id};
}

abstract class DbBase {
  final RecordBase Function() getRecordClass;

  RecordBase record;
  Map<String, dynamic> json;

  DbBase(this.getRecordClass);

  void create() {
    record = getRecordClass();
    json = record.toJson();
    print(json);
  }
}

class CategoryRecord extends RecordBase {
  @override
  Map<String, dynamic> toJson() {
    return <String, dynamic>{'category': 'xxxx', ...super.toJson()};
  }
}

class TagRecord extends RecordBase {
  @override
  Map<String, dynamic> toJson() {
    return <String, dynamic>{'tag': 'yyyy', ...super.toJson()};
  }
}

class CategoryDb extends DbBase {
  CategoryDb() : super(() => CategoryRecord());
}

class TagDb extends DbBase {
  TagDb() : super(() => TagRecord());
}

void main() {
  final categoryDb = CategoryDb();
  categoryDb.create(); // {category: xxxx, id: 42369}

  final tagDb = TagDb();
  tagDb.create(); // {tag: yyyy, id: 97809}
}

Я не совсем уверен, следует ли рассматривать метод create() как метод или конструктор. Поэтому я решил сделать метод более близким к вашему коду.

...