Мне просто было любопытно узнать, как лучше (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)));
}
}
Что-нибудь попроще?