是否可以获取类型名称的字符串表示形式以用作模板文字类型?

2023-11-27

我试图返回一个更简洁的compile来自类型函数的错误消息,并且想知道是否可以获取类型名称的字符串表示形式?

所以使用这个解决方案(不幸的是,本文不使用锚链接,因此您需要搜索 ErrorBrand)要创建错误消息,是否可以执行以下操作:

type ErrorBrand<Err extends string> = Readonly<{
  [k in Err]: void;
}>;

type MyErrorMsgType<T extends string> = ErrorBrand<`The following type caused an error - ${T}`>
type MyType = {field:string};

type GetStringNameOfType<T> = // converts Type to string name of type

type MyTypeName = GetStringNameOfType<MyType> // outputs 'MyType'

type MyTypeError = MyErrorMsgType<MyTypeName>
// output - The following type caused an error - MyType

操场


目前 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(使用前将#替换为@)

是否可以获取类型名称的字符串表示形式以用作模板文字类型? 的相关文章

随机推荐

Powered by Hwhale