Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 回调函数中对象的通用键名_Typescript_Object_Typescript Generics - Fatal编程技术网

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});