"keyof" 和 "string" 的联合类型,具有工作自动完成功能

Union type of "keyof" and "string" with working autocompletion

我想公开一个方法,该方法将某些 Union 类型作为参数并为此提供自动完成功能。由于可以通过声明合并扩展此联合类型,因此自动完成是此处的关键功能。

但是如果用户在使用我的库时不使用 TypeScript,或者不想在声明中添加特定的类型,那么它应该接受 string 替代联合类型。

简而言之:我想要自动完成联合类型,但也允许任何不匹配的字符串。

只有联合类型的例子:

export interface Values {
   'variant-a': undefined,
   'variant-b': undefined,
   'variant-c': undefined,
}

function doAThing<T extends keyof Values>(name: T): void {
  console.log(name);
}

我尝试过的事情:

  1. 添加函数重载: function doAThing<T extends keyof Values>(name: string): void; - 将类型与 keyof Values 合并,然后两者都变成字符串。没有自动补全。
  2. 使通用类型成为与 string 的联合:<T extends keyof Values | string>- 仅合并到 string。也没有自动完成。

我找到了解决方案here:

export type Values = {
   'variant-a': undefined,
   'variant-b': undefined,
   'variant-c': undefined,
}

type AnyString<T> = T | (string & {});

function doAThing<T extends keyof Values>(name: AnyString<T>): void {
  console.log(name);
}

doAThing('variant-b');  // Autocompleted
doAThing('variant-d');  // Not autocompleted, but still accepted