当前位置: 首页 > 知识库问答 >
问题:

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

南门志
2023-03-14

我从AWS放大器教程中复制了以下内容:

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个答案

谢胤
2023-03-14

导入并使用类型:

import type { Property } from 'csstype'

使用属性. FlexDirection指定类型

齐甫
2023-03-14

试试这个

const styles: { container: React.CSSProperties} = {
    container: { flexDirection: 'column' }
};
刘令
2023-03-14

下面是一个演示该问题和四种可能的解决方案的TS操场:

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将为您要声明的对象推断类型<code>字符串</code>。您可能会在某处对其进行修改并更改值,在这种情况下,文字类型将不正确。因此,修复它的基本选项是:

  • 手动注释变量,以便 TypeScript 不会推断字符串。
  • 添加为“列”强制转换以告诉 TypeScript 使用文本类型。
  • 在字段或整个对象上使用 const 来告诉 TypeScript 不允许更改字段,这允许 Typescript 推断文本值。
 类似资料:
  • 问题内容: 在Go中,a 是原始类型,这意味着它是只读的,对其的每次操作都会创建一个新的字符串。 因此,如果我想多次连接字符串而又不知道结果字符串的长度,那么最好的方法是什么? 天真的方法是: 但这似乎不是很有效。 问题答案: 新方法: 在Go 1.10+中strings.Builder,这里是。 生成器用于使用Write方法有效地构建字符串。它最大程度地减少了内存复制。零值可以使用了。 与几乎相

  • 我正在尝试实现这样一个方法,它接受一个关键参数,该参数要么是要么是可索引类型接口的实例。实现如下所示: Typescript给出块的以下错误: [ts]“IValidationContextIndex”仅引用类型,但在此处用作值。 有什么办法解决这个问题吗? 对于大多数接口,我认为可以添加属性(;),但这在本例中不起作用,因为该接口是可索引类型的接口....

  • 问题内容: 我知道使用“ +”串联运算符来构建字符串效率很低,这就是为什么建议使用StringBuilder类的原因,但是我想知道这种模式是否也效率低下? 我猜这里编译器会优化分配,好吗? 问题答案: 该特定示例将由编译器内联: Java 9+将使用带有makeConcatWithConstants的invokedynamic来内联此代码,以使其高效。根据输出: 但是,如果 and 是编译时间常数

  • 我正在尝试设置一个Perl脚本,该脚本将使用通过Stripe处理信用卡费用。 我能够成功请求令牌,但当我使用该令牌过帐费用时,出现以下错误: 错误:无效的\u请求\u错误-无效字符串:{“exp\u month”= 这是我的密码 我应该使用以外的东西作为卡片值吗?

  • 我试图解决这项任务,但我失败了,因为返回不起作用。我是java新手,希望你能帮助我。 任务是删除字符串中的每个x,但不是第一个和最后一个。

  • 问题内容: 为什么下面的工作?我希望会被抛出。 问题答案: 为什么必须起作用? 在JLS 5,第15.18.1.1节 JLS 8§15.18.1 “字符串连接运算符+” ,导致JLS 8,§5.1.11 “字符串转换”,要求该操作无故障成功: …现在只需要考虑参考值。如果引用为null,则将其转换为字符串“ null”(四个ASCII字符n,u,l,l)。否则,转换的执行就好像是通过调用不带参数的