const数组类型,其主要成员也是常量。当定义一个const数组[number, string, boolean]
时,它的length
类型是3
。此外,当访问特殊索引时,类型也会指向确切的const类型。
function const_array(): void
{
let elements: [number, string, false] = [3, "something", false];
let length: 3 = elements.length;
let first: number = elements[0];
let second: string = elements[1];
let third: false = elements[2];
}
然而,字面量类型与const数组类型不同。当定义一个字面量类型"something"时,它的length
不是9
而是number
。此外,当访问特殊索引时,类型不是特殊的字面量类型,而是string
类型。
function literal(): void
{
let word: "something" = "something" as const;
let length: number = something.length; // not 9 but number
let first: string = word[0]; // not "s" but string
let second: string = word[1]; // not "o" but string
let third: string = word[2]; // not "m" but string
}
那么,如何将字面量类型增强为类似于const数组类型的呢?
9条答案
按热度按时间ui7jx7zq1#
听起来像是#34589的重复。
bqf10yzr2#
不,我不这么认为。#34589 是关于元组类型的。这是关于使用字面量类型为
.length
和字符串字面量的元素。cygmwpex3#
了解为什么这会有用会很好。
unftdfkk4#
要实现对 边缘下划线字符串 的类型检测,我已经发布了一个新的 issue
,希望 (Literal.length - 1) 也是常量值。然而,我不能确定我已经为 边缘下划线字符串 请求了确切的功能。如果我遗漏了什么重要的事情,请告知我。
jtw3ybtb5#
有很多使用场景
一个使用场景是Assert一个方法只被调用一次,模仿其他语言中的
char
类型:还防止将字面空字符串作为参数传递:
我相信还有其他固定长度字符串的用例(固定长度哈希?或者身份证?)
在我看来,这个建议是一个非常好的补充,对于DSLs和构建器来说非常棒。
oxiaedzo6#
另一个用例:目前,某些类型级别的算术利用数组长度产生数字字面量的事实。这会导致性能问题。在
type-plus
中,我正在进行这项工作,并在开发过程中需要将位数限制为3-4位,以便IDE仍然具有性能优势。如果
'abc'['length']
获得与[1,1,1]['length']
相同的处理方式,那么可能会有显著的性能提升。类型级别算术的另一个例子是:Implementing Arithmetic Within TypeScript’s Type System
当然,最佳解决方案是添加
🍺
qxsslcnc7#
正如指出的,我认为在字符串上有一些更好的打字可能性会很好。
使用案例
wnvonmuf8#
你好,对于那些正在寻找更高效解决方案的人,我已经为那些仍然面临这个问题但由于其性能不佳而无法使用线性实现的人创建了一个对数实现。
编辑:嗯,我会考虑一个对数字符串索引器。
icnyk63a9#
关于这个PR是否受欢迎?如果受欢迎,我想尝试一下。