获取 TypeScript 中类型的类名

L. *_* S. 6 types string-literals typescript template-literals

在 TypeScript 4.1 中,是否可以获取字符串类型的类名或函数名?

例如

class Foo { }

type Tpl = `${Foo["name"]}_${"a" | "b" | "c"}`; // error
// should be
// "Foo_a" | "Foo_b" | "Foo_c"
Run Code Online (Sandbox Code Playgroud)

编辑(扩展用例)

由于第一个示例不够明确,可以使用"Foo_a" | "Foo_b" | "Foo_c"as 类型来解析,这里是另一个示例。


class Animal { /* code */ }
class Dog extends Animal { }
class Cat extends Animal { }
class Duck extends Animal { }
// also, someone outside my original code decide to implement another
// animal, and so on. (for example, "MyAwesomeChimera")
class MyAwesomeChimera extends Animal { }

// "try" to extract name
type GetName<T extends Function> = T["name"]; // return string for now
// the goal here is, for whatever reasons,
// to use template literal to pre validate a query string
// that uses class names
type ClassQueryTemplate<T extends Array<typeof Animal>> =
  `CQT ${ GetName<T[number]> }---CALL()`;

function querier<T extends Array<typeof Animal>>(...animals: T):
  (query: ClassQueryTemplate<T>) => void { /* code */ return null as any; }

// impl & usage
const query = querier(
  Dog,
  Duck,
  MyAwesomeChimera,
  Cat,
);

// tests
query(`CQT Duck---CALL()`); // ok, but no autocomplete
query(`CQT Dog---CALL()`); // ok, but no autocomplete
query(`CQT Cat---CALL()`); // ok, but no autocomplete
query(`CQT MyAwesomeChimera---CALL()`); // ok, but no autocomplete
query(`CQT Horse---CALL()`); // ok but should be error
// basically, the query string is typed as: `CQT ${string}---CALL()`
// which is not good
Run Code Online (Sandbox Code Playgroud)

游乐场链接

我看到了“nameof”运算符提案,我希望这不是“答案”。