Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.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中带有演绎和“keyof”的细粒度类型_Typescript_Typescript3.0 - Fatal编程技术网

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,它会工作。使用该类型的任何值。