[英]Typescript Interface, reference one instance property for dynamic second property
[英]Making a Dynamic callable typescript interface property
这是调色板的一部分,我在这里使用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})`,
},
}
问题是我想创建一个具有动态属性的接口,无论是作为字符串的键,还是键也是可调用的。
考虑这个例子:
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
}
我注意到,如果这是一种方法,则使用Alpha
后缀;如果是 HEX 颜色,则使用Color
或Text
。 这就是为什么我决定为Data
接口使用两个不同的键。
您可以为RGBA
使用 stonger 类型,但有一个限制。 请看我的文章和这个答案。
关于 HEX colors 的相同故事。请参阅本文。
请提供所有场景或限制,我会尽力为您提供最安全的类型。
谢谢
更新您在评论中使用的语法:
[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',
};
您可以删除特定的键:
export type AlphaColorProcessing = (opacity: number) => string;
export interface Styles {
[key: string]: string | AlphaColorProcessing;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.