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”运算符提案,我希望这不是“答案”。
| 归档时间: |
|
| 查看次数: |
1421 次 |
| 最近记录: |