[英]TypeScript generic type parameters are inferred with functions, but not type?
考虑一下:
type SpecificKeys<T extends string> = {
[key in T]: string;
};
const foobar: SpecificKeys<"foo" | "bar"> = {
foo: "foo",
bar: "bar",
};
创建foobar
,我必须将键的联合指定为泛型类型参数,这是多余的。 我想不出任何办法来解决这个问题。 但是如果我写一个什么都不做的函数:
function makeSpecificKeys<T extends string>(thing: SpecificKeys<T>): SpecificKeys<T> {
return thing;
}
const foobarInferred = makeSpecificKeys({
foo: "foo",
bar: "bar",
});
那么 const foobarInferred
被正确键入为SpecificKeys<"foo" | "bar">
SpecificKeys<"foo" | "bar">
我不必通过枚举所有键来重复自己。
在创建类型化变量时,有什么方法可以实现对泛型类型参数的推断,而不必创建无所作为的函数?
答案是否定的。 类型限制值,说a:T
意味着值a
需要是类型T
的成员,如果不是 - 则编译错误。 你想要的是说a: infer me typeof a
,所以a: infer me typeof a
。
类型注解是用来限制值的,而不是用来限制类型的值。 TS 允许从值中获取类型,但它不允许获取值的类型并立即对其进行限制。
不过,我们可以制作一些技巧来使其工作。 考虑类型级解决方案:
type SpecificKeys<T extends string> = {
[key in T]: string;
};
// type level version of makeSpecificKeys
type MakeSpecificKeys<T extends SpecificKeys<string>> = T;
const foobar = {
foo: "foo",
bar: "bar",
};
type FoobarType = MakeSpecificKeys<typeof foobar> // fine 👌
const badfoobar = {
foo: 1, // number value dont match SpecificKeys
bar: "bar",
};
type BadFoobarType = MakeSpecificKeys<typeof badfoobar> // error 👌
值foobar
和badfoobar
都由 TS 正确推断,没有任何类型注释。 接下来是调用类型级别MakeSpecificKeys
,这是您之前创建的一种 id 函数,但这是在类型级别,它以与makeSpecificKeys
相同的方式限制参数类型。 对于badfoobar
它显示编译错误。
我在这里展示的无疑是最糟糕的方法,然后是您所做的值构造函数makeSpecificKeys
。 所以坚持下去。 使用上述方法的一点是,当makeSpecificKeys
这样做时,它不会进入运行时。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.