TypeScript的`Partial`类型为指定的键允许未指定类型作为有效值的原因是什么?

huangapple go评论76阅读模式
英文:

Why is TypeScript's `Partial` type allowing unspecified types as a valid value for a specified key?

问题

type Test = { a: string; b: boolean; c: number }
type Key = keyof Test;

function foo(x: Key): Partial<Test> {
  return { [x]: null };
}

对于上面的代码,foo 返回一个 Test 的部分,返回对象的键绑定到 Key,即 'a' | 'b' | 'c'。然而,尽管参数是 Test 的键,但 null 值可以赋值给 Partial<Test>

这是否是 TypeScript 的预期行为?

英文:
type Test = { a: string; b: boolean; c: number }
type Key = keyof Test;

function foo(x: Key): Partial&lt;Test&gt; {
  return {[x]: null};
}

playground

For the above code, foo returns a Partial of Test, and the key of the return object is bound to Key, &#39;a&#39; | &#39;b&#39; | &#39;c&#39;. However, even though the argument is the key of the Test, the null value is assignable for the Partial&lt;Test&gt;.

Is it intended behaviour for TypeScript?

答案1

得分: 2

这不是一个特定的答案,因为这个问题似乎更像是 TypeScript 中的一个错误或未实现的特性,而不是你的代码问题,但以下是一些解决此问题的方法:

  1. 使用 satisfies 操作符,我们可以确保返回类型符合我们设置的要求:
function foo(x: Key): Partial&lt;Test&gt; {
  return { [x]: null satisfies Test[Key] }; // 这会检查是否可以将 'null' 分配给 'Test' 中的某个值,而不改变 'null' 的类型。
}
  1. { [x]: null } 的类型是 { [x: string]: null },所以如果我们使用类似的语法设置返回类型(或创建一个变量并设置其类型),我们再次会得到正确的错误:
function foo(x: Key): { [x: string]: Test[Key] } {
  return { [x]: null };
}
英文:

This is not an answer per se since this issue seems more like a bug or an unimplemented feature in TypeScript than an issue in your code, but here are some workarounds to this issue:

  1. Using the satisfies operator, we can ensure that the return type adheres to what we set:
function foo(x: Key): Partial&lt;Test&gt; {
  return { [x]: null satisfies Test[Key] }; // This checks whether &#39;null&#39; is assignable to one of the values in &#39;Test&#39; without changing the type of &#39;null&#39;.
}
  1. The type of { [x]: null } is { [x: string]: null }, so if we set the return type (or, create a variable and set its type) using a similar syntax, we once again get the correct error:
function foo(x: Key): { [x: string]: Test[Key] } {
  return { [x]: null };
}

huangapple
  • 本文由 发表于 2023年6月1日 12:56:46
  • 转载请务必保留本文链接:https://go.coder-hub.com/76378771.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定