gpt4 book ai didi

typescript - 在不使用类型断言的情况下在 Typescript 中键入匿名对象

转载 作者:搜寻专家 更新时间:2023-10-30 21:37:33 24 4
gpt4 key购买 nike

考虑:

type Foo = {
bar: string,
baz: number
}

const bars = ['a', 'b', 'c'];
const foos = bars.map<Foo>((bar, i) => {
return {
bar,
baz: i
}
});

这将强制执行 map 返回值的确切类型,例如我可以说

return {
bar,
baz: i,
extraProp: 'boo!' // this works! (bad - i want this to fail)
}

它会正常工作。这与我不使用泛型类型并在返回值上使用类型断言的效果相同:

return {
bar,
baz: i,
extraProp: 'boo!' // works (bad)
} as Foo

我能想出让实际类型完全强制执行的唯一方法是创建一个临时变量:

const returnVal: Foo = {
bar,
baz: i,
// extraProp: 'boo!' // won't work - good! typescript prevented a bug!
}
return returnVal;

是否有任何语法允许创建匿名对象,例如在 return 语句中允许完全强制执行类型,而不仅仅是类型断言?

最佳答案

问题在于对象文字只有在直接分配给参数/变量/返回值时才会检查额外属性。当您在 map 上指定类型参数时,箭头函数将首先使用此签名首先键入:

(bar: string , i: number) => {    
bar: string,
baz: number,
extraProp: string
}

然后检查此函数与 map 参数(类型为 (bar: string , i: number) => Foo)的兼容性,并会发现它是兼容的。

一个简单的解决方法是不在 map 上指定类型,而是在箭头函数的返回类型上指定类型:

const foos = bars.map((bar, i): Foo => {
return {
bar,
baz: i,
extra: "" // error here, as expected
}
});

这不是类型断言,但您确实需要指定类型,但无论如何您都是在 map 上指定类型,因此键入的数量大致相同。

关于typescript - 在不使用类型断言的情况下在 Typescript 中键入匿名对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49051466/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com