Можно ли сделать типобезопасную коллекцию функций в TS? - PullRequest
0 голосов
/ 02 мая 2019

Я пишу небольшую библиотеку, чтобы упростить работу с редуксом, но я застрял на наборе текста. То, что я пытаюсь сделать, сводится к следующему:

  • родительский класс обрабатывает дескрипторы действий в действиях
  • дочерний класс предоставляет указанные дескрипторы

Проблема в том, что информация о типе, определенная в child, теряется в процессе.

Наименьший контрольный пример выглядит следующим образом:

type callable = (...args: any[]) => any
interface CallableCollection {
    [s: string]: callable
}

class Parent {
    functions: CallableCollection
    constructor() {
        this.functions = this.a;
    }
    get a(): CallableCollection {
        return {};
    }
}

class Child extends Parent {
    get a() {
        return {
            a: (x: string) => x,
            b: (x: number) => x,
        }
    }
}

const test = new Child();
test.a.a(5);//type error
test.functions.a(5);// no type errors

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

Есть ли способ заставить его работать нормально в TS, не предоставляя типизацию в качестве аргументов в универсальном классе?

1 Ответ

2 голосов
/ 02 мая 2019

Полагаю, это зависит от вашего фактического варианта использования, но иногда вы можете использовать polymorphic this, чтобы занять место дженериков, когда конкретный тип, о котором идет речь, выводится из других свойств подкласса:

interface CallableCollection {
  [s: string]: (...args: any[]) => any;
}

class Parent {
  functions: this["a"]; // polymorphic this and a lookup of "a"
  constructor() {
    this.functions = this.a;
  }
  get a(): CallableCollection {
    return {};
  }
}

class Child extends Parent {
  get a() {
    return {
      a: (x: string) => x,
      b: (x: number) => x
    };
  }
}

const test = new Child();
test.a.a(5); //type error
test.functions.a(5); // type error

Это работает для вас?Надеюсь, это поможет;удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...