dav*_*000 9 typescript reactjs
所以我有一个反应项目,其中组件采用高度支柱。该 prop 用于确定组件的 css 属性(我使用情感库)
例如,
render() {
const styles = css`
height: ${this.props.height};
`;
return (
<div style={styles}>
...
</div>
);
}
Run Code Online (Sandbox Code Playgroud)
我有一个高度类型,目前是
interface Props {
height: number | string;
}
Run Code Online (Sandbox Code Playgroud)
我不想创建一个检查高度是否为字符串的类型,而是创建一个验证高度单位(如果它是字符串)的类型。
例如,
10px
是一个有效的道具,所以没有打字稿错误。
10xp
会抛出打字稿错误。
有没有办法创建一个类型来检查第一部分是数字,第二部分是这些值之一?
type CssAbsoluteUnit = "cm" | "mm" | "in" | "px" | "pt" | "pc";
type CssRelativeUnit = "em" | "ex" | "ch" | "rem" | "vw" | "vh" | "vmin" | "vmax" | "%";
Run Code Online (Sandbox Code Playgroud)
我想以打字稿编译器会抛出错误的方式来执行此操作,因此仅使用正则表达式来验证渲染并不能真正完成这项工作。
这可以通过Template Literal Type来实现,尽管对于可能错误地传递为有效的内容存在一些限制:
type Unit = '%' | 'px' | 'em' | 'vh' | 'vh'
type HeightProp = `${number}${Unit}`
const valid: WidthValue[] = ['10%', '100px', '100em', '100vh', '100vw'] // Valid
const invalid: WidthValue[] = ['10leagues', 'one-hundred-px'] // Error
const falseNegative: WidthValue[] = ['10 px', '0e1px'] // Invalid but passes
Run Code Online (Sandbox Code Playgroud)
这个例子并不详尽,但这个概念可以扩展到涵盖更广泛的 CSS 属性和有效值。
小智 2
不幸的是,这听起来像是编译器完成其工作后在运行时期间确定的事情。但是,如果您提前知道要传递哪些值,则可以创建一个接口并为要传入的类型实现类。
像这样的东西:
interface CssUnit {
getValue(): string;
}
class PxUnit implements CssUnit {
private unit: string;
constructor(value: number) {
this.unit = value + "px";
}
getValue(): string {
return this.unit;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,
interface Props {
height: CssUnit;
}
Run Code Online (Sandbox Code Playgroud)
您所要做的就是传递您已实现的课程之一。
希望有帮助!
归档时间: |
|
查看次数: |
1956 次 |
最近记录: |