这可能是重复的,因为我认为这是一个相对常见的问题,但不幸的是我找不到任何东西。
如果我想定义一个采用泛型的函数,则打字稿通常能够推断出泛型的类型:
const f = <T>(x: Record<string, T>) => x;
const x = f({ a: { x: 1 }, b: { x: 1 } });
Typescript在这里没有问题,我不需要提供泛型的类型。
但是,如果我尝试在界面中执行相同的操作,则不能;我需要明确提供类型:
type X<T> = Record<string, T>;
const x: X = { a: { x: 1 }, b: { x: 1 } };
从某些方面,我可以看到为什么。我们可以在实际给变量赋值之前定义变量的类型,因此泛型并不总是可推断的。但是我也不能这样做:
const x = { a: { x: 1 }, b: { x: 1 } } as X;
对于类型和接口,好像必须要明确提供泛型的类型,这似乎是该语言语法的一部分。但是我错过了什么吗?谁能提供任何帮助?
答案 0 :(得分:1)
似乎正在对此进行处理,请参见issue-26242,尤其是issue-26242-comment(还有issue-30120,它在这里与您的示例非常相似):
也许可以采用部分申请提案中的
?
foo<?, ?, string>(); // returns [{}, {}, string]
在TypeScript中已经代表
optional
。实际上,的含义与提案非常相似,并且可以考虑如下内容:
type Foo<T, U, V> = T | U | V;
type Bar = Foo<?, string, ?>; // equal to type Bar<A, B> = A | string | B;
(我是通过搜索2314来找到此错误的,该错误代码目前由运动场管理员给出。您的代码段,我以前在搜索错误代码方面已经取得了成功)。