带有keyof的打字稿预设键

时间:2020-05-23 19:07:06

标签: typescript

我想预设一个按键,但我不想限制用户仅使用这些按键。

type B = {
  a: string;
  b: number;
}

type T = keyof B | string;


function someFunc(key: T) {}

someFunc(); // key type is `T`

在上述情况下,我想为ab获得自动完成功能,但是用户也可以使用他们想要的任何字符串。有可能吗?

2 个答案:

答案 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#26277microsoft/TypeScript#33471microsoft/TypeScript#34714。但是,就短期而言,这不是语言的一部分,因此,如果您想要类似的语言,则必须使用变通方法。

我看到的解决方法涉及定义编译器将接受任何string值的类型,但是避免或推迟到string的减少,因为它取决于某些未指定的泛型类型。例如:

function someFunc<S extends string>(key: S | keyof B) { }

在这里,我们在someFunc()中将S设为通用类型,但仅限于stringkey参数的类型为S | keyof B。您为key输入的任何字符串值最终都将是S的推断类型,因此它将接受任何string

someFunc("a"); // okay
someFunc("b"); // okay
someFunc("omega"); // okay

但是自动完成功能会建议"a""b",因为它在提出建议时不知道S是什么:

enter image description here

万岁!我敢肯定,在将原本应该是具体类型转换为泛型类型时,会涉及很多极端情况,并且您可能会得出这样的结论:副作用对您而言并不值得。毕竟,这是一种解决方法,因此请轻而易举。


无论如何,希望能有所帮助;祝你好运!

Playground link to code

答案 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