Класс экспорта TypeScript на основе конфигурации - PullRequest
2 голосов
/ 25 января 2020

Хорошо, во-первых, TypeScript довольно нов для меня, я долгое время C # ist, но мне нравится то, что я могу быстро взломать в Node / TypeScript - у меня есть проблема с синтаксисом (я думаю), у меня есть интерфейс, который реализуется двумя конкретными классами и третьим модулем, который экспортирует один из этих конкретных классов на основе конфигурации: ie

fruit.ts

export interface Fruit {
  eat();
}

apple.ts

export class Apple implements Fruit {
  eat() { console.log('Eat apple'); }
}

banana.ts

export class Banana implements Fruit {
  eat() { console.log('Eat banana'); }
}

завтрак.ts

import { Fruit } from 'fruit';
import { Apple } from 'apple';
import { Banana } from 'banana;

const BreakfastType: typeof Fruit = config.appleForBreakfast ? Apple : Banana;   <-- Error

export { BreakfastType }

Похоже, это должно сработать для меня, Apple и Banana - это "виды фруктов", поэтому объявление BreakfastType как "typeof Fruit", я думаю, имеет смысл, но TypeScript жалуется на

Fruit относится только к типу, но используется здесь как значение

Это явно надуманный пример, но он точно соответствует тому, что я пытаюсь сделать, я хочу, чтобы другой код был

import { BreakfastType } from 'breakfast';
let breakfastFood = new BreakfastType();    <-- create Apple or Banana based on config

Любые предложения высоко ценится

1 Ответ

1 голос
/ 25 января 2020

Итак, здесь есть несколько проблем, во-первых, вы не можете использовать typeof для типов машинописи, но вы можете использовать его только для js переменные, классы, объект и все другие нетипичные вещи. Поэтому следующая строка должна , а не иметь typeof Fruit:

const BreakfastType: typeof Fruit = config.appleForBreakfast ? Apple : Banana;

Вместо этого она должна быть такой:

const BreakfastType: Fruit = config.appleForBreakfast ? Apple : Banana;

Но возникает еще одна проблема, все еще жалуюсь на типы: Property 'eat' is missing in type 'typeof Apple' but required in type 'Fruit'. И после некоторого исследования я обнаружил, что если вы укажете BreakfastType указанным выше способом, машинопись будет выглядеть так:

Она обрабатывает BreakfastType как переменную типа Fruit, но мы пытаемся присвоить ему Apple или Banana. Но они классы , а не экземпляр этих классов. Таким образом, в качестве решения вы можете явно указать, что BreakfastType - это класс, а не экземпляр с new () => Fruit

const BreakfastType: (new () => Fruit) = config.appleForBreakfast ? Apple : Banana
const MyBreakfast = new BreakfastType() // MyBreakfast will have Fruit type now

Надеюсь, это поможет ^ _ ^

...