英文:
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<Test> {
return {[x]: null};
}
For the above code, foo
returns a Partial
of Test
, and the key of the return object is bound to Key
, 'a' | 'b' | 'c'
. However, even though the argument is the key of the Test
, the null
value is assignable for the Partial<Test>
.
Is it intended behaviour for TypeScript?
答案1
得分: 2
这不是一个特定的答案,因为这个问题似乎更像是 TypeScript 中的一个错误或未实现的特性,而不是你的代码问题,但以下是一些解决此问题的方法:
- 使用
satisfies
操作符,我们可以确保返回类型符合我们设置的要求:
function foo(x: Key): Partial<Test> {
return { [x]: null satisfies Test[Key] }; // 这会检查是否可以将 'null' 分配给 'Test' 中的某个值,而不改变 'null' 的类型。
}
{ [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:
- Using the
satisfies
operator, we can ensure that the return type adheres to what we set:
function foo(x: Key): Partial<Test> {
return { [x]: null satisfies Test[Key] }; // This checks whether 'null' is assignable to one of the values in 'Test' without changing the type of 'null'.
}
- 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 };
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论