我想预设一个按键,但我不想限制用户仅使用这些按键。
type B = {
a: string;
b: number;
}
type T = keyof B | string;
function someFunc(key: T) {}
someFunc(); // key type is `T`
在上述情况下,我想为a
和b
获得自动完成功能,但是用户也可以使用他们想要的任何字符串。有可能吗?
答案 0 :(得分:1)
编译器将联合"a" | "b" | string
减少为string
。从类型系统的角度来看,这是“正确的”,因为您要接受任何string
值,并且"a"
和"b"
只是特定的值。但是从IntelliSense和IDE提示的完成列表的角度来看,类型string
丢失了"a" | "b" | string
拥有的信息。理想情况下,您希望编译器在尝试写入值的同时记住建议 string
和"a"
的同时,将此类并集折叠为"b"
在您的IDE中输入。
不幸的是,这当前不是TypeScript的功能。 GitHub上实际上存在多个与此有关的问题,您可能需要转到其中一个或所有问题并给他们一个?。最大的问题可能是microsoft/TypeScript#29729,而且看来这个问题实际上将很快由设计团队进行审查(从2020-05-23开始)。还有microsoft/TypeScript#26277,microsoft/TypeScript#33471和microsoft/TypeScript#34714。但是,就短期而言,这不是语言的一部分,因此,如果您想要类似的语言,则必须使用变通方法。
我看到的解决方法涉及定义编译器将接受任何string
值的类型,但是避免或推迟到string
的减少,因为它取决于某些未指定的泛型类型。例如:
function someFunc<S extends string>(key: S | keyof B) { }
在这里,我们在someFunc()
中将S
设为通用类型,但仅限于string
。 key
参数的类型为S | keyof B
。您为key
输入的任何字符串值最终都将是S
的推断类型,因此它将接受任何string
:
someFunc("a"); // okay
someFunc("b"); // okay
someFunc("omega"); // okay
但是自动完成功能会建议"a"
和"b"
,因为它在提出建议时不知道S
是什么:
万岁!我敢肯定,在将原本应该是具体类型转换为泛型类型时,会涉及很多极端情况,并且您可能会得出这样的结论:副作用对您而言并不值得。毕竟,这是一种解决方法,因此请轻而易举。
无论如何,希望能有所帮助;祝你好运!
答案 1 :(得分:0)
type B = {
a: string;
b: number;
}
type C = {[key:string]: string | number } & B
const c: C = {
a: "123",
b: 123,
d: "123"
}
具有自动完成功能。检出here