【问题标题】:Typescript inline type declaration for object-member对象成员的打字稿内联类型声明
【发布时间】:2022-01-26 16:27:24
【问题描述】:

在以下代码块中,使用<>-Notation 定义了属性笔的类型:

return {
    ...defaultValues, 
    pens: 
      <[{penStrokeColor: string, penStrokeWidth: number, penOpacity: number}]>
      [...Array(5).keys() ].map((_)=> { 
        return {
          penStrokeColor: defaultValues.currentItemStrokeColor,
          penStrokeWidth: defaultValues.currentItemStrokeWidth,
          penOpacity: defaultValues.currentItemOpacity
        }})
  }

上面的代码有效,但我的 linter 抱怨这个类型提示应该以不同的方式声明:

Use 'as [{ penStrokeColor: string; penStrokeWidth: number; penOpacity: number }]' instead of '<[{ penStrokeColor: string; penStrokeWidth: number; penOpacity: number }]>'  @typescript-eslint/consistent-type-assertions

这也可以内联完成吗?如果可以,怎么做?

【问题讨论】:

  • 为什么你首先使用类型断言呢?那是一种代码气味。 (尖括号类型断言正在过时,因为它们与 JSX/TSX 不兼容,很容易与类型参数混淆,我个人觉得它们很难看,而 as 断言要好得多,imo .
  • 旁注:[...Array(5).keys() ].map 可能是 Array(5).keys().map
  • 请参阅Array.from,了解从回调创建数组的更自然方式
  • @JuanMendes 我以前使用过 Array.from 但由于某种原因,所有五个元素都会引用同一个实例 - 因此,通过更改一个对象,它会更改所有五个 - 我真的很想确定这个问题已修复,所以我使用了扩展语法(这可能不是必需的 xD)和 map
  • @MartinDallinger 笑说“我真的很想确保这个问题得到解决,所以我使用了扩展语法”

标签: javascript typescript eslint


【解决方案1】:

正如错误所说 - 使用 as 而不是尖括号表示法来断言类型。

return {
    ...defaultValues, 
    pens: 
      [...Array(5).keys() ].map((_)=> { 
        return {
          penStrokeColor: defaultValues.currentItemStrokeColor,
          penStrokeWidth: defaultValues.currentItemStrokeWidth,
          penOpacity: defaultValues.currentItemOpacity
        }}) as [{penStrokeColor: string, penStrokeWidth: number, penOpacity: number}]
  }

但我认为这不是你想要的——你真的想告诉 TS 创建的数组是一个元组,只有一个项目吗?由于您要创建 5 个元素,因此您可能需要一个数组类型。

如果是这种情况,则根本不需要类型断言 - TS 可以正确推断出创建的数组是所需的类型。

return {
    ...defaultValues, 
    pens: [...Array(5).keys() ].map((_)=> { 
        return {
          penStrokeColor: defaultValues.currentItemStrokeColor,
          penStrokeWidth: defaultValues.currentItemStrokeWidth,
          penOpacity: defaultValues.currentItemOpacity
        };
    })
};

无需任何 TypeScript 语法即可推断出正确的类型。

【讨论】:

  • 原来我原来的定义是错误的——我希望它是一个数组,但将它定义为一个元组!正如您正确指出的那样,这种转换不应该是必要的 - thx
猜你喜欢
  • 2021-01-20
  • 1970-01-01
  • 2018-11-06
  • 2020-01-08
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
  • 2017-08-12
  • 1970-01-01
相关资源
最近更新 更多