TypeScript中带有演绎和“keyof”的细粒度类型
所以我有一个类型TypeScript中带有演绎和“keyof”的细粒度类型,typescript,typescript3.0,Typescript,Typescript3.0,所以我有一个类型 type A = { a?: T1, b?: T1 } 我有一个函数 const fn: <N extends keyof A>(name: N) => ({ [P in N]: T2 }) = name => ({ [name]: T2 }); 这个繁重的泛型表达式的思想是静态地推断结果的类型。它可以工作,我写fn'a',编译器推断它的类型为name:a=>{a:T2;},除了函数本身,它说类型“{[x:string]:T2;}”不
type A = {
a?: T1,
b?: T1
}
我有一个函数
const fn: <N extends keyof A>(name: N) => ({ [P in N]: T2 })
= name => ({ [name]: T2 });
这个繁重的泛型表达式的思想是静态地推断结果的类型。它可以工作,我写fn'a',编译器推断它的类型为name:a=>{a:T2;},除了函数本身,它说类型“{[x:string]:T2;}”不可分配给类型“{[P in N]:T2}”
问:有没有一种方法可以为函数fn编写类型,从文本中保持良好的静态类型推断,但避免令人讨厌的类型错误
仅用as重写type是可以的,但我的尝试没有成功。此语法适用于我:
const fn = <N extends keyof A>(name: N) =>
({ [name]: T2 }) as ({ [P in N]: T2 });
请注意,首先出现该类型错误的原因是,如果N设置为非单例类型,则这是不合理的。如前所述,一种将N约束为单态类型的方法会有所帮助。你能解释一下T1和T2是什么吗?它们是泛型类型,还是与主题无关的任意类型?那么v:number=>number[]定义在这里意味着什么?抱歉,它是未清理的T2T1和T2是任意绑定的非泛型参数。幻灯片17似乎是一个很好的工作示例。您可以通过将返回类型设置为{[K in N]:Record}[N]来解决可靠性问题,但编译器仍然不相信它是安全的,因此断言可能是最佳或唯一的解决方案。它说在类型描述中找不到N的名称“N”。小问题:我更新了我的问题,v:number=>number[]是T2,因为短,我无法重现错误。你能在上面复制它并发布一个链接吗?好的,如果我替换第一个T2,它会工作。使用该类型的任何值。