【发布时间】:2020-09-30 13:53:16
【问题描述】:
有人能帮我理解为什么“失败”行会失败吗?以及如何在没有变通方法强制转换的情况下使其按预期工作?
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
});
我收到此错误:
类型参数 '{ [x: string]: string; }' 不可赋值
'{ [key in Key] 类型的参数:字符串; }'.(2345)
我想了解为什么目前失败,以及如何使其不失败。
我怎样才能键入这个函数,以便它在类型方面仍然像现在一样在“外部”工作(即'foobar' 以keyName 形式传入obj.foober,而obj.notHere 或其他任何东西都是不是),但我可以在不使用 as 演员表的情况下调用 fn 函数。
注意: javascript code 工作正常,是 Typescript 类型检查失败,我不明白为什么会这样。
【问题讨论】:
-
这是一个错误或设计限制;见microsoft/TypeScript#13948。您的类型断言(您称之为“强制转换”)是一种合理的解决方法。
-
@jcalz 啊...嗯,这很烦人,但我至少知道那里(目前)不是我真正正确执行此操作的方法。 IE。并不是我在这里误解了一些重要的东西,只是 Typescript 把事情搞砸了。
标签: typescript object typescript-generics