"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);
}
我尝试过的事情:
- 添加函数重载:
function doAThing<T extends keyof Values>(name: string): void;
- 将类型与 keyof Values
合并,然后两者都变成字符串。没有自动补全。
- 使通用类型成为与
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
我想公开一个方法,该方法将某些 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);
}
我尝试过的事情:
- 添加函数重载:
function doAThing<T extends keyof Values>(name: string): void;
- 将类型与keyof Values
合并,然后两者都变成字符串。没有自动补全。 - 使通用类型成为与
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