这是调色板的一部分,我在这里使用IPalette界面:

{
  warningColor: '#FFCA28',
  smallWidgetBackground: ["rgba(255,255,255,0.15)", "rgba(255,255,255,0)"],
  grayColorAlpha: (opacity: number) => `rgba(200, 209, 232, ${opacity})`,
  welcome: {
    primaryText: "#fff",
    primaryTextAlpha: (alpha = 1) => `rgba(255,255,255,${alpha})`,
  },
}

问题是,我想创建一个具有动态属性的接口,既可以将键作为字符串,也可以调用键.

推荐答案

考虑一下exmaple:



type RGBA = `rgba(${number}, ${number}, ${number}, ${number})`

type Alpha = (opacity: number) => RGBA

type KeysHex = `${string}Color` | `${string}Text`

interface Data {
  [color: KeysHex]: `#${string}`
  [alpha: `${string}Alpha`]: Alpha
}

const foo: Data = {
  criticalColor: '2' // expected error
}

const bar: Data = {
  criticalColor: '#2' // ok, there is a limitation in TS
}

const baz: Data = {
  criticalColorAlpha: (opacity: number) => `rgba(1, 1, 1, ${opacity})` // ok
}

const baz2: Data = {
  criticalColorAlpha: (opacity: number) => `rgba(1, 1, 1, x)` // expected error
}

Playground

我注意到,如果这是一种方法,你使用Alpha后缀,如果是十六进制 colored颜色 ,则使用ColorText后缀.这就是为什么我决定在Data界面上使用两个不同的键.

RGBA可以使用stonger类型,但有一个限制.请看我的articlethis答案.

关于六边形 colored颜色 的故事也是一样.请看this篇文章.

请提供所有场景或限制,我将尽力为您提供最安全的类型.

非常感谢.

UPDATE

  [key in AdditionalKeysHex]:`#${string}`|string[];

这是错误的.只允许在映射类型中使用in运算符.为了达到预期的行为,我认为Data接口应该被拆分.

请参阅DataResult类型:

type RGBA = `rgba(${number}, ${number}, ${number}, ${number})`

type Alpha = (opacity: number) => RGBA

type KeysHex = `${string}Color` | `${string}Text` | `${string}Icon` | `${string}Background`;

const arr = ['white', 'darkGrayBlue', 'secondDarkGrayBlue', 'thirdDarkGrayBlue', 'darkDullBlue', 'secondDarkDullBlue', 'lightGrayBlue', 'secondLightGrayBlue', 'thirdLightGrayBlue', 'fourthLightGrayBlue', 'fifthLighGrayBlue', 'lightGrayNavy', 'paleNavy', 'brightBlue']

type AdditionalKeysHex = 'white' | 'darkGrayBlue' | 'secondDarkGrayBlue' | 'thirdDarkGrayBlue' | 'darkDullBlue' | 'secondDarkDullBlue' | 'lightGrayBlue' | 'secondLightGrayBlue' | 'thirdLightGrayBlue' | 'fourthLightGrayBlue' | 'fifthLighGrayBlue' | 'lightGrayNavy' | 'paleNavy' | 'brightBlue';

interface IWelcome {
  [color: KeysHex]: `#${string}` | string[];
  [alpha: `${string}Alpha`]: Alpha;
}


type WithKey = {
  [key in AdditionalKeysHex]: `#${string}` | string[];

}

interface Data {
  [color: KeysHex]: `#${string}` | string[];
  [alpha: `${string}Alpha`]: Alpha;
  welcome: IWelcome;
}

type DataResult = WithKey & Data

const Palette: DataResult = {
  primaryText: "#58585B",
  secondaryText: "#39393B",
  secondaryIcon: "#C8D1E8",
  tertiaryText: "#8F8E94",
  smallWidgetBackground: ["rgba(255,255,255,0.15)", "rgba(255,255,255,0)"],
  grayColorAlpha: (opacity: number) => `rgba(200, 209, 232, ${opacity})`,
  primaryTextAlpha: (opacity: number = 1) => `rgba(255, 255, 255, ${opacity})`,
  welcome: {
    primaryText: "#fff",
    primaryTextAlpha: (opacity: number = 1) => `rgba(255, 255, 255, ${opacity})`,
    secondaryText: "#C8D1E8",
    loaderColor: "#fff",
  },
  white: '#FFFFFF',
  darkGrayBlue: '#363C52',
};


Playground

Javascript相关问答推荐

zoom svg以适应圆

如何在angular中从JSON值添加动态路由保护?

为什么ngModel不能在最后一个版本的Angular 17上工作?'

以Angular 实现ng-Circle-Progress时出错:模块没有导出的成员

如何创建返回不带`new`关键字的实例的类

如何在Svelte中从一个codec函数中调用error()?

让chart.js饼图中的一个切片变厚?

每次重新呈现时调用useState initialValue函数

Docent.cloneNode(TRUE)不克隆用户输入

WebSocketException:远程方在未完成关闭握手的情况下关闭了WebSocket连接.&#三十九岁;

如何修复错误&语法错误:不能在纯react 项目中JEST引发的模块&之外使用导入语句?

MongoDB通过数字或字符串过滤列表

如何在独立的Angular 应用程序中添加Lucide-Angel?

ComponentWillReceiveProps仍在React 18.2.0中工作

将以前缓存的 Select 器与querySelector()一起使用

如何调整下拉内容,使其不与其他元素重叠?

在JS/TS中构造RSA公钥

Playwright:ReferenceError:browserContext未定义

使用重新 Select 和对象理解 Select 器备忘

VITE版本中的内联SVG