Реализовать индексированный векторный класс строк в TypeScript - PullRequest
0 голосов
/ 28 октября 2019

Мне просто было любопытно узнать, как лучше (TypeScript) решить следующую проблему:

Я хочу создать класс для представления цветов в разных вариантах, например, RGB, RGBA, CMYK или что-то нестандартное. По сути, я хотел бы выполнять векторные операции с этими цветными объектами или создавать их с помощью константы, и я хочу иметь только один массив моих «каналов» (например, ['r', 'g', 'b'] или ['032C', '072U'], когда я делаю Pantone)и тогда все должно работать без необходимости повторного ввода этих имен.

В vanilla JS это достигается с помощью:

channels=['r', 'g', 'b']
class Color {
    constructor(f) {
        channels.forEach(j => (this[j] = f(j)));
    }
}

Здесь я могу создать экземпляр цвета с помощью константы, например: black=new Color(j=>0) или я могу сделать цветовую арифметику, например, с помощью yellow=new Color(j=>red[j]+green[j]).

Однако я не нашел хорошего способа перевести это в типизированный код TS, не повторяя имена своих каналов как минимум три раза. Лучшее, что я придумал, это:

type channel = 'r' | 'g' | 'b'
let channels: channel[] = ['r', 'g', 'b']
class Color {
    r!: number
    g!: number
    b!: number
    constructor(f: (j: channel) => number) {
        channels.forEach(j => (this[j] = f(j)));
    }
}

Что-нибудь попроще?

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