Typescript 回调函数中对象的通用键名
有人能帮我理解为什么“失败”行失败吗?我如何才能让它像我期望的那样工作,而不需要变通铸造Typescript 回调函数中对象的通用键名,typescript,object,typescript-generics,Typescript,Object,Typescript Generics,有人能帮我理解为什么“失败”行失败吗?我如何才能让它像我期望的那样工作,而不需要变通铸造 function useObjectWithSingleNamedKey<Key extends string>( keyName: Key, value: string, fn: (obj: {[key in Key]: string}) => void) { fn({ [keyName]: value }) // <-- Fails, but why? fn(
function useObjectWithSingleNamedKey<Key extends string>(
keyName: Key,
value: string,
fn: (obj: {[key in Key]: string}) => void)
{
fn({ [keyName]: value }) // <-- Fails, but why?
fn({ [keyName]: value } as { [key in Key]: string }) // <-- Unwanted workaround
}
useObjectWithSingleNamedKey('foobar', 'test', obj => {
console.log(obj.foobar) // <-- Should work and does
console.log(obj.notHere) // <-- Should fail and does
});
函数useObjectWithSingleNamedKey(
keyName:Key,
值:字符串,
fn:(obj:{[key-in-key]:string}=>void)
{
fn({[keyName]:value})/它不起作用的原因是,从技术上讲,泛型
可能比作为keyName
传递的文本字符串更宽
obj:{[key in key]:string}
意味着obj
必须为可分配给key
的每个可能的键都有一个值。您假设这只是一个键,但typescript肯定不知道
下面是一个示例,用于说明函数失败的位置。此函数调用完全有效,并且没有typescript错误。失败位于函数体内部
useObjectWithSingleNamedKey<'foo' | 'bar'>('foo', 'test', obj => {obj.bar});
但我们无法概括此映射,因为我们无法确定对象只有一个属性。这是一个缺陷或设计限制;请参阅。您的类型断言(您称之为“cast”)是一个合理的解决方法。@jcalz啊……这很烦人,但至少我知道(目前)对我来说,这并不是一个正确的方法。也就是说,我并没有误解这里的一些关键问题,只是打字稿把事情搞砸了。
const barCallback = (obj: {bar: string}): string => obj.bar.toUpperCase();
const callBarCallback = (bar: string): string => barCallback({bar});