目前 TypeScript 中没有将类型名称转换为字符串的功能文字类型。我找不到对此确切功能的现有请求(有一些类似的事情,例如被拒绝的微软/TypeScript#29944要求将类型名称作为字符串文字发出value在运行时,这绝对违反规则)所以你可能可以归档你自己的.
我不会very对它被接受持乐观态度,因为类型名称本质上是一个实现细节,虽然它们对于文档和编译器消息很有用,但它们并不是您真正希望在类型系统本身。 (考虑这条评论根据转换请求联合类型 into 元组类型, or 用于实现标记元组元素的 PR这确保说这些标签不会影响类型系统,仅用于文档/显示)。
让我们想象一下有一个TypeToString<T>
将产生以下结果的实用程序类型:
interface A { x: string }
interface B { x: string }
type NameOfA = `It is ${TypeToString<A>}`;
// type NameOfA = "It is A"
type NameOfB = `It is ${TypeToString<B>}`;
// type NameOfB = "It is B"
现在人们可以做这样有趣的事情:
function whoAmI<T>(x: T, name: TypeToString<T>): void { }
const a: A = { x: "" };
whoAmI(a, "A"); // okay
or
interface Wha extends Record<TypeToString<B>, string> { }
const wha: Wha = { B: "hmm" }; // okay?
在这两种情况下的输出TypeToString<T>
泄漏到类型系统中通常为实际文字字符串值保留的位置。并且因为A
and B
are 结构上相同,编译器认为它们是相同的类型:
const b: B = a; // okay
The name类型的类型对于类型系统来说并不重要。这会很奇怪TypeToString<T>
能够从相同的类型中提取不同的信息,并允许这样做会对结构类型系统中的可分配性产生一些不幸的影响。
但我不认为你真的想要这些名称作为字符串文字types您可以将其用作接口中的键名称或用作 a 的判别值受歧视联盟,或作为类型声明文件, 正确的?上面的例子whoAmI
and Wha
are misuses的功能。
您只想能够在中显示类型名称messages并进行其他字符串操作或插值来格式化这些消息。在我看来,您真正想要的功能是“无效类型”,如微软/TypeScript#23689或者可能“throw
类型”作为实验实施微软/TypeScript#40468(关键词是“实验性”;这个特定的 PR 被标记为“草案”,没有理由认为它会被合并到 TypeScript 版本中,至少以这种形式)。
这个想法是有一个像这样的类型函数Invalid<T>
如果该类型被实例化,则会引发编译器错误,并且错误消息将源自于T
某种程度上来说。例如:
function noFunctions<T>(
t: T extends Function ?
Invalid<["Hey,", T, "is a function type. I SAID NO FUNCTIONS!!"]> :
T
): void { }
noFunctions(123); // okay
noFunctions(String); // error!
// -------> ~~~~~~
// Hey, 'StringConstructor' is a function type. I SAID NO FUNCTIONS!!
你不需要转身StringConstructor
转换为字符串文字类型"StringConstructor"
;您只是希望该字符串出现在错误消息中。
有趣的是,公关微软/TypeScript#40468实际上实现了一个TypeToString<T>
具有您正在寻找的确切行为的实用程序类型!由于此 PR 尚未合并,并且可能永远不会合并,因此它看起来不像拥有可观察的内容的含义TypeToString<T>
字符串文字类型已经被彻底讨论过,甚至已经被真正考虑过。 PR 的存在让我有点不那么自信了TypeToString<T>
会被拒绝,但谁知道呢。
无论如何你可能想给予女士/TS#23689 a
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)