TypeScript 中类似“string[7]”的含义是什么?
What is the meaning of something like `string[7]` in TypeScript?
今天在使用 TypeScript 时,我想将一个字段键入一个具有设置大小的字符串数组。虽然我知道如何在 TS 中实际执行此操作,但我的 C 直觉 让我写下:
interface MyInterface {
arrayField: string[7];
// ...
}
我注意到 linter 和编译器都没有对此抱怨,但似乎 arrayField
现在只是简单地键入 string
。有人知道这里发生了什么吗?
我认为这是一个错误。我想应该是 string[]
.
虽然这个符号 string[7]
从 TS 的角度来看是有效的,但它没有任何意义。
string
只是一个原始类型。因为所有值都是 javascript 中的对象,string
类型也有一组允许的 methods/indexed 属性。
通俗地说javascript"abs"[0]
returnsa
。由于 TypeScript 没有 char
类型,它应该与 javascript 兼容。因此 string[10000]
returns 只是一个
string
.
在这里您可以找到 string
类型的所有内置属性:
type StringProperties= {
[Prop in keyof string]: { key: Prop, value: string[Prop] }
}
How do we make a fixed length string in TS ?
仅在条件类型的帮助下。您应该遍历每个字符并将此字符放入数组中。然后你需要将数组的长度与预期的字符串长度进行比较。
参见示例:
type ToArray<T extends string, Cache extends readonly string[] = []> =
T extends ''
? Cache
: T extends `${infer A}${infer Rest}`
? ToArray<Rest, [...Cache, A]>
: Cache
type IsValid<T extends string[], Len extends number> = T['length'] extends Len ? true : false
type IsLength<T extends string, Len extends number> = IsValid<ToArray<T>, Len> // ok
type Result1 = IsLength<'hello', 6> // false
type Result2 = IsLength<'hello', 5> // true
如果你对字符串验证技术感兴趣,可以阅读我的blog
固定长度很容易做到:
interface MyInterface {
arrayField: [string, string, string, string, string, string, string];
}
嗯,这是可能的,但对于大整数来说,这是非常糟糕的。你可以写入开发工具简单的代码:
function array(length, type = "string") {
return `[${Array(length).fill(type)}]`
}
今天在使用 TypeScript 时,我想将一个字段键入一个具有设置大小的字符串数组。虽然我知道如何在 TS 中实际执行此操作,但我的 C 直觉 让我写下:
interface MyInterface {
arrayField: string[7];
// ...
}
我注意到 linter 和编译器都没有对此抱怨,但似乎 arrayField
现在只是简单地键入 string
。有人知道这里发生了什么吗?
我认为这是一个错误。我想应该是 string[]
.
虽然这个符号 string[7]
从 TS 的角度来看是有效的,但它没有任何意义。
string
只是一个原始类型。因为所有值都是 javascript 中的对象,string
类型也有一组允许的 methods/indexed 属性。
通俗地说javascript"abs"[0]
returnsa
。由于 TypeScript 没有 char
类型,它应该与 javascript 兼容。因此 string[10000]
returns 只是一个
string
.
在这里您可以找到 string
类型的所有内置属性:
type StringProperties= {
[Prop in keyof string]: { key: Prop, value: string[Prop] }
}
How do we make a fixed length string in TS ?
仅在条件类型的帮助下。您应该遍历每个字符并将此字符放入数组中。然后你需要将数组的长度与预期的字符串长度进行比较。
参见示例:
type ToArray<T extends string, Cache extends readonly string[] = []> =
T extends ''
? Cache
: T extends `${infer A}${infer Rest}`
? ToArray<Rest, [...Cache, A]>
: Cache
type IsValid<T extends string[], Len extends number> = T['length'] extends Len ? true : false
type IsLength<T extends string, Len extends number> = IsValid<ToArray<T>, Len> // ok
type Result1 = IsLength<'hello', 6> // false
type Result2 = IsLength<'hello', 5> // true
如果你对字符串验证技术感兴趣,可以阅读我的blog
固定长度很容易做到:
interface MyInterface {
arrayField: [string, string, string, string, string, string, string];
}
嗯,这是可能的,但对于大整数来说,这是非常糟糕的。你可以写入开发工具简单的代码:
function array(length, type = "string") {
return `[${Array(length).fill(type)}]`
}