gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:38:06 25 4
gpt4 key购买 nike

我从 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 保持警惕。

最佳答案

这是 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 推断文字值。
  • 关于javascript - TypeScript 说一个字符串是无效的,即使它在联合中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62432985/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com