【问题标题】:Stricter return type for object literal in TypescriptTypescript 中对象文字的更严格返回类型
【发布时间】:2021-12-03 08:25:55
【问题描述】:

在这段代码中

const s = "myKey" as const;
const myF = () => ({
  [s]: 0,
});

myF 的类型是function myF(): {[p: string]: number, myKey: number}

返回类型为{[p: string]: number, myKey: number}

如您所见,不需要的 [p: string]: number 在这里泄漏。

如何在没有显式类型注释的情况下使我的返回类型成为预期的 {myKey: number}?

我还不想进入显式注释,因为我得到了一些包含很多字段的类型。

【问题讨论】:

  • 您使用的是什么版本的打字稿?当我将您的代码粘贴到typescript playground 时,我看到myF 对于大多数版本的打字稿都有() => { myKey: number } 类型
  • 你的实际代码比上面的复杂吗?我猜您可能会遇到这样一种情况,即您的实际代码中的 s 等效项被输入为 string 而不是特定的字符串文字类型,这会导致您看到的情况。
  • Typescript Playground 显示了预期的行为。也许问题是我正在检查 IDEA(Ultimate / Webstorm,没关系)类型检查器。也许这确实是 IDEA 问题。
  • > 你的实际代码比上面的更复杂吗?是的,但我将其简化为这个例子。

标签: typescript type-inference


【解决方案1】:

这是 TypeScript 的默认行为。它总是将计算属性评估为字符串。

您可以编写自定义助手来创建对象:

const s = "myKey";

const record = <Prop extends PropertyKey, Value>(prop: Prop, value: Value) => 
  ({ [prop]: value }) as Record<Prop, Value>

// const myF: () => Record<"myKey", number>
const myF = () => record(s, 42)

Playground

你不需要使用as const

请注意,此解决方案有一个缺点。

const drawback = record<'myKey' & { hello?: 'world' }, 42>('myKey', 42).myKey // error

因此,您最好避免对该函数使用显式泛型

【讨论】:

  • > 这是 TypeScript 的默认行为。它总是将计算属性评估为字符串。 ``` const prop = "PROP"; const myO = { [prop]: 1 }; ``` 类型为{PROP: number}
  • 我想这就是我想要实现的 - 与函数返回具有相同的行为。我的真实类型远不止这些——它有几个不同类型的道具。
  • @IgorLoskutov 请分享你的真实例子
猜你喜欢
  • 2021-09-21
  • 2021-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
相关资源
最近更新 更多