TypeScript 严格数组连接

np8igboo  于 2022-10-29  发布在  TypeScript
关注(0)|答案(5)|浏览(138)

建议

🔍检索词

x1m0n1x

可行性检查表

我的建议符合以下准则:

  • 这不会是对现有TypeScript/JavaScript代码的重大更改
  • 这不会改变现有JavaScript代码的运行时行为
  • 这可以在不基于表达式的类型发出不同JS的情况下实现
  • 这不是一个运行时特性(例如,库功能、带JavaScript输出的非ECMAScript语法、JS的新语法糖等)
  • 此功能与TypeScript's Design Goals的其余部分一致。

不是100%肯定的最后一个。我觉得它会虽然。
第一种,只有当它是作为一个选择加入的选项。

建议

一个强制Array.join调用的选项,它只能连接字符串或可赋值的数组元素。join函数可以用于任何类型的数组(包括any😉)。即使是与string完全不兼容的类型。join函数基本上把它作为一个黑盒子,任何类型的数组类型都被神奇地转化为字符串......不知怎么的,我觉得这不对。

📃激励性示例

这里有一个Playground链接,它说明了此功能可以防止的问题。

💻#用例

当我在做一个有效的Array.join时一切都很好,但是当我后来决定改变数组中元素的类型,而忘记对join做一些事情时,它会导致完全正确和可移植的代码,这在运行时会产生奇怪的行为。例如,如果数组元素是一个字符串,现在它们变成了某种对象。
检查一个数组的元素类型是否可以赋值给string,可以防止这样的错误。为了保持现有代码库的兼容性,我建议在compilerOptions中选择加入。就像有一个strictFunctionTypes一样,可能还有一个额外的strictArrayJoins或类似的东西。

ncecgwcz

ncecgwcz1#

因此,您实际上需要#26357,或者希望将其完全限制为string和字符串文字。

drkbr07n

drkbr07n2#

我不确定我是否想要#26357,也不确定它是否包含join,但如果包含的话,那也没问题,因为join总是连接到一个字符串,所以它实际上将join限制为字符串类型。

bt1cpqcv

bt1cpqcv3#

我提到这个问题是因为您写了“or are assignable to a string”。要确定哪些类型可分配给string,您需要这个问题(或者将它限制为string本身或字符串文字)。

envsm3lx

envsm3lx4#

对我来说,问题是数组元素从string变成了string[],这在输出中产生了逗号(在我的例子中是错误的),因为每个string[]元素都将得到toString-ed,成为逗号分隔的数组。
我希望如果实现了#26357,它不会解决这个特殊的情况,因为Array原型确实包括toString,因此仍然是允许的。
我想我所要求的是一个更严格的形式,其中 * 隐式 * toString()调用将被阻止。
/编辑
执行此操作时已引发错误:

const s: string = [1,2,3];

即使它 * 可以 * 允许一个隐式的toString
但是,当join-ing这样的元素时:

const s: string = [[1,2,3],[1,2,3],[1,2,3]].join('');

突然间一切都好了。希望这能更好地说明问题。

nnvyjq4y

nnvyjq4y5#

join可能应该被定义为(this: ReadonlyArray<string>, separator?: string | undefined): string;
这是一个突破性的变化。

相关问题