我有2个类似的问题: 我最近一直在使用打字稿,但是我需要我的样式组件代码才能对打字稿进行验证。
1。我需要描述自定义道具-阴影,因为打字稿返回错误
属性“阴影”在类型上不存在 'ThemedStyledProps, HTMLDivElement>,“颜色” | “样式” | “标题” | ... 251更多... | “ key”>&{...; }&{...; },DefaultTheme>。 TS2339
export const InputBlock = styled.div<{height: string}>`
display: flex;
width: 100%;
height: ${props => (props.height ? props.height : "56px")};
${props =>
props.shadow &&
css`
box-shadow: ${props =>
props.shadow ? "4px 4px 10px rgba(31,31,31,0.1)" : "none"};
`};
`;
2。我如何在界面中描述此props.touched [props.name]
interface FormSchema {
errors: {
[name: string]?: string, // ????
},
touched: {
[propName: string]?: string, // ???
},
value: string,
theme: {
color: {
redError?:string,
inactiveBlue?:string,
green?:string,
}
}
}
const colorStateForm = (props: FormSchema) =>
props.errors &&
props.touched &&
props.errors[props.name] &&
props.touched[props.name]
? props.theme.color.redError
: !props.value && (!props.value.length || props.value.length === 0)
? props.theme.color.inactiveBlue
: props.theme.color.green;
我在表单中使用了Formik和Yup
答案 0 :(得分:1)
我找到了我的问题的答案=)
第一个问题
我们应该创建 type 或 interface
type ColorStateForm = {
errors: any,
touch: any,
name: string,
value: string,
theme: any,
hideDefault?: boolean
}
比我们在样式化组件中使用 type 或 interface
export const CheckBoxCustom = styled.div<ColorStateForm >`
width: ${props => (props.width ? props.width : "24px")};
height: ${props => (props.height ? props.height : "24px")};
margin: ${props => (props.margin ? props.margin : "0")};
position: relative;
overflow: hidden;
border-radius: 4px;
flex: 0 0 24px;
&:before {
${props =>
props.hideDefault &&
css`
content: "";
position: absolute;
top: 0;
left: 0;
display: block;
width: ${props => (props.width ? props.width : "24px")};
height: ${props => (props.height ? props.height : "24px")};
border-style: solid;
border-width: 2px;
border-color: ${props =>
props.errors &&
props.touched &&
props.errors[props.name] &&
props.touched[props.name]
? props.theme.color.redError
: props.theme.color.mainBlue};
box-sizing: border-box;
`};
}
这是我们需要将TypeScript用于条件CSS的地方 在线
&:before {
${props =>
props.hideDefault &&
css`
我们需要再次传递我们的 type 或接口。例如:
&:before {
${(props: ColorStateForm ) =>
props.hideDefault &&
css`
仅此而已,我的VS代码对TypeScript干净且友好
第二个问题
首先,我创建了 type
type ColorStateForm = {
errors: any,
touch: any,
name: string,
value: string,
theme: any
}
是的,我知道“任何”类型都是邪恶的,您可以改写任何内容
比我重写了我的三元运算符并添加了我创建的类型
const colorStateForm = (props: ColorStateForm): string => {
const {errors, touched, name, value, theme} = props;
if(errors && touched && errors[name] && touched[name]){
return theme.coloor.redError;
}
if(!value && (!value.length || value.length === 0)) {
return theme.color.inactiveBlue;
}
return theme.color.green;
}
我希望此信息会有用