下面是一个示例代码片段:
type Color = string;
interface Props {
color: Color;
text: string;
}
function Badge(props: Props) {
return `<div style="color:${props.color}">${props.text}</div>`;
}
var badge = Badge({
color: '#F00',
text: 'Danger'
});
console.log(badge);
Playground
如果颜色无效,我会尝试得到一个构建错误,如下所示:
var badge = Badge({
color: 'rgba(100, 100, 100)',
text: 'Danger'
});
有没有办法定义Color
,使它只允许匹配以下模式之一的字符串?
#FFF
#FFFFFF
rgb(5, 5, 5)
rgba(5, 5, 5, 1)
hsa(5, 5, 5)
我意识到有像red
和white
这样的颜色,但如果Color
可以接受这些颜色,这可能会使这个问题更难回答。
6条答案
按热度按时间2ledvvac1#
'${...}'表示法在新的(^4.1)ts版本中可用。
https://www.typescriptlang.org/docs/handbook/2/template-literal-types.html
zengzsys2#
有一个关于a type of string which matches a pattern(regex或其他东西)的提议,但是这个提议还没有实现。
因此,不幸的是,从TypeScript 2.2开始,您所要求的是不可能的。
dxpyg8gm3#
在一般意义上还不能这样做,但是如果有一组定义良好的颜色,就可以使用常量和字符串类型:
显然,如果您想允许 * 任何 * 颜色,这将是不实际的,但在现实中,您可能 * 确实 * 希望有可重用的颜色变量。
在我的项目中,我使用脚本从我的
colors.css
文件生成一个类似的文件,该文件定义了一系列CSS属性:转换为:
我会这样说:
uqdfh47h4#
从理论上讲,联合类型是可能的,但是如果你只是使用十六进制代码,你就有超过16,000,000种可能的组合,而typescript(至少4.6.3)不喜欢这种想法。
它已经被微软搁置了一年多了
crcmnpdw5#
对颜色有效性
if (process.env.NODE_ENV === 'development')
进行运行时检查是目前最合适的解决方案,因为TypeScript(从4.8.4开始)无法处理这样的复杂类型。我试着创建一个HEX颜色类型,如果你只是以人类的身份阅读代码,它似乎应该可以工作,但实际上它失败了,因为任何比短格式CSS HEX颜色(如#fff)更重载的东西都失败了:
因此,您只能确保CSS颜色的3个字符的完全类型安全,甚至不考虑大写字母。
作为一种解决方法,您可以构造一个函数,该函数接受
r, g, b, a
所有类型的HexEncodedNumber,并且TypeScript将对参数进行类型检查,但是如果您试图在返回语句中添加as const
或'as'#${string}',则该函数的ReturnType<>
将只是string
或any
。RGB的情况应该是差不多的,因为它是相同的可能的组合数量。
wfypjpf46#
看起来您在示例中使用的是React。一个简单的选项可能是导入
CSSProperties
并访问color
属性。这样做的好处是它可以很容易地提供任何形式的颜色:命名颜色,如
yellow
,aliceblue
或powderblue
,十六进制值,RGB,HSL或任何有效CSS字符串这在功能上与使用
string
相同,但类型用法更有表现力。如果需要使用类型保护,请使用第一个答案。