`string & {}` 的用途是什么

Kaa*_*aan 3 generics typescript reactjs

我试图输入gridTemplateColumnscss 属性,在 React 的一个名为 csstype 的依赖项中,我发现了以下属性定义:

  gridTemplateColumns?: Property.GridTemplateColumns<TLength> | undefined;
Run Code Online (Sandbox Code Playgroud)

这是以下接口的属性,其中TLengthTTime被声明。

export interface StandardLonghandProperties<TLength = (string & {}) | 0, TTime = string & {}> {
Run Code Online (Sandbox Code Playgroud)

我不明白string & {}想要实现什么目标。它和普通的有什么不同string

jca*_*alz 6

因为所谓的空对象类型{}只排除了nulland undefined(参见如何理解类型any、unknown、{}之间以及它们与其他类型之间的关系?),交集 string & {}就相当于string它接受什么值。string因此,对于大多数用途来说, 和之间没有区别,string & {}因此没有理由使用更复杂的类型。

但即使string & {}可能被认为与 相同string,编译器也不会急切地将前者简化为后者,例如,它的方式string & unknown其中类型unknown被与 的交集吸收string),或者它对联合类型的方式就像string | "x"(其中字符串文字类型 "x"被与 的并集吸收string)。

因此,其用途之一string & {}是防止出于 IntelliSense 自动建议/自动完成和文档目的而急切减少某些内容。该类型(string & {}) | "x"允许与 相同的值string,但仍然具有足够的类型“内存” "x",以便由支持 IntelliSense 的 IDE 建议。microsoft/TypeScript#29729中提到了此技术,作为一种解决方法,解决了缺乏对字符串文字联合自动完成的本机支持的情况string


尽管如此,在frenic/csstype 中的接口定义中所示的情况下(string & {}) | 0,它似乎没有动机。提示 for和 just的 IntelliSense 没有什么区别(因为它是一个数字文字,它不会被并集吸收),并且提示 for和 just 的IntelliSense 肯定没有区别,因为没有文字完全建议。string & {}StandardLonghandProperties(string & {}) | 0string | 00string & {}string

那么,为什么会这样呢?如果您查看frenic/csstype#73问题,似乎有很多地方确实使用了字符串文字与 的并集string,而 IntelliSense 却在这些地方受到了影响。显然 frenic/csstype 有自己的构建系统来生成TypeScript 声明文件。因此frenic/csstype#74中的修复方法是更改​​生成代码,这样它就不再只是生成stringandnumber类型,而是生成(string & {})and (number & {})

string & {}这意味着您正在查看的代码中确实没有太多原因。如果 frenic/csstype 的维护者愿意,他们可以更改代码,以便stringnumber单独留在不属于具有相同基本类型的文字的联合的地方。也就是说,他们可以确保& {}只出现在改进 IntelliSense 建议的地方。

但这需要更多的工作。虽然这样的更改可能会减少引发此问题的混乱,但当前的代码并不存在错误。相反,它是一种(大部分)无害的副作用。