为了账号安全,请及时绑定邮箱和手机立即绑定

TypeScript 说一个字符串是无效的,即使它在联合中?

TypeScript 说一个字符串是无效的,即使它在联合中?

至尊宝的传说 2022-10-08 15:14:01
我从 AWS Amplify 教程中复制了以下内容:const styles = {  container: { flexDirection: 'column' },  ...};<div style={styles.container}>但我得到:Type '{ flexDirection: string; }' is not assignable to type 'CSSProperties'.  Types of property 'flexDirection' are incompatible.    Type 'string' is not assignable to type '"column" | "inherit" | "-moz-initial" | "initial" | "revert" | "unset" | "column-reverse" | "row" | "row-reverse" | undefined'.我可以通过将样式内联来轻松解决这个问题,但我很好奇为什么 TypeScript 认为这是一个错误。这是一个非常基本的例子,我很惊讶 TS 在它上面失败了,所以它让我对使用 TS 保持警惕。
查看完整描述

3 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

这是一个TS Playground,说明了问题和四种可能的解决方案:

type FlexDirection = "column" | "inherit" | "-moz-initial" | "initial" | "revert" | "unset" | "column-reverse" | "row" | "row-reverse" | undefined;


type Styles = {

    container: {

        flexDirection: FlexDirection

    }

}


function doStuff(a: Styles) { }


const stylesDoesNotWork = {

    container: { flexDirection: 'column' }

};


const stylesWithCast = {

  container: { flexDirection: 'column' as 'column' }

}


const stylesFieldConst = {

    container: { flexDirection: 'column' } as const

};


const stylesConst = {

    container: { flexDirection: 'column' }

} as const;


doStuff(stylesDoesNotWork);

doStuff(stylesWithCast);

doStuff(stylesFieldConst);

doStuff(stylesConst);

默认情况下,TypeScript 将为string您声明的对象推断类型。您可能会在某处对其进行变异并更改值,在这种情况下,文字类型将不正确。因此,修复它的基本选项是:

  • 手动注释变量,以便 TypeScript 不会推断字符串。

  • 添加as 'column'cast 以告诉 TypeScript 使用文字类型。

  • 在字段或整个对象上使用as const来告诉 TypeScript 不允许更改字段,这允许 Typescript 推断文字值。


查看完整回答
反对 回复 2022-10-08
?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

尝试这个


const styles: { container: React.CSSProperties} = {

    container: { flexDirection: 'column' }

};


查看完整回答
反对 回复 2022-10-08
?
郎朗坤

TA贡献1921条经验 获得超9个赞

导入并使用类型:

import type { Property } from 'csstype'

使用 Property.FlexDirection 指定类型


查看完整回答
反对 回复 2022-10-08
  • 3 回答
  • 0 关注
  • 244 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号