Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 将字符串类型转换为字符类型的数组_Typescript_Types_Beta - Fatal编程技术网

Typescript 将字符串类型转换为字符类型的数组

Typescript 将字符串类型转换为字符类型的数组,typescript,types,beta,Typescript,Types,Beta,在TypeScript 4.1中,哪一个开发版本已经可以通过npm获得支持,以及是什么创造了一些真正有趣的机会 让我们假设我们有以下类型 // type is '0123456'; const actualString = '0123456'; 任务 按字符将字符串拆分为新数组,但应保留数组元素的类型 // Unfortunately, type is string[] const chars1 = actualString.split(''); // Throws error: strin

在TypeScript 4.1中,哪一个开发版本已经可以通过npm获得支持,以及是什么创造了一些真正有趣的机会

让我们假设我们有以下类型

// type is '0123456';
const actualString = '0123456';
任务 按字符将字符串拆分为新数组,但应保留数组元素的类型

// Unfortunately, type is string[]
const chars1 = actualString.split('');

// Throws error: string[] is not assignable ['0', '1', '2', '3', '4', '5', '6']
const chars2: ['0', '1', '2', '3', '4', '5', '6'] = actualString.split('');
我对这个的看法
type StringToChars=BASE扩展`${infer}`
? BASE扩展了`${expert FIRST\u CHAR}${expert REST}`//BASE是可推断的
? [FIRST_CHAR,…StringToChars]//BASE至少有一个字符
:[]//基是空字符串
:字符串[];//BASE是简单的字符串
//类型为['0','1','2','3','4','5','6']
Chars类型=StringToChars;
问题 此解决方案适用于小于14个字符的字符串

// Throws: Type instantiation is excessively deep and possibly infinite. (ts2589)
type LargeCharsArray = StringToChars<'0123456789 01234'>
//抛出:类型实例化太深,可能是无限的。(ts2589)
类型LargeCharsArray=StringToChars
显然,它遇到了typescript类型递归限制,在第14个字符检查后,它留给我们的是
[,…any[]]

问题: 这个递归类型调用看起来非常糟糕,所以我想知道,有没有更可靠的方法将字符串类型转换为chars类型的数组


递归限制相当肤浅,实现模板文本类型的pull请求提到,当您试图一次分离一个字符的字符串时,这是一个难点。由实施者提供:

请注意,这些类型很快就会与递归深度限制器发生冲突。这是一个我仍在思考的问题

所以现在我不认为有一个解决方案可以用于任意长度的字符串


也就是说,您可以通过一次断开较大的块来绕过限制,这样您就不必重复太多。可能有一些最佳的方法可以做到这一点,但我只是通过反复试验找到了一些方法,将最长的可拆分字符串从~14个字符增加到~80个字符:

type StringToChars<T extends string> =
  string extends T ? string[] :
  T extends `${infer C0}${infer C1}${infer C2}${infer C3}${infer C4}${infer C5}${infer R}` ? [C0, C1, C2, C3, C4, C5, ...StringToChars<R>] :
  T extends `${infer C0}${infer C1}${infer C2}${infer C3}${infer R}` ? [C0, C1, C2, C3, ...StringToChars<R>] :
  T extends `${infer C0}${infer R}` ? [C0, ...StringToChars<R>] : []


type WorksWith80 = StringToChars<'12345678911234567892123456789312345678941234567895123456789612345678971234567898'>;
type Len80 = WorksWith80['length']; // 80

type BreaksWith81 = StringToChars<'123456789112345678921234567893123456789412345678951234567896123456789712345678981'>;
type Len81 = BreaksWith81['length']; // number
输入StringToChars=
字符串扩展到T?字符串[]:
T扩展了`${experre C0}${experre C1}${experre C2}${experre C3}${experre C4}${experre C5}${experre R}`?[C0,C1,C2,C3,C4,C5,…弦托卡尔]:
T扩展了`${experre C0}${experre C1}${experre C2}${experre C3}${experre R}`?[C0,C1,C2,C3,…弦托卡尔]:
T扩展了`${experre C0}${experre R}`?[C0,…StringToChars]:[]
类型WorksWith80=StringToChars;
键入Len80=使用80[“长度”];//80
类型BreaksWith81=StringToChars;
Len81类型=BreaksWith81['length'];//数
你可以看到,我们不只是抓取一个角色,而是尝试抓取六个角色。如果失败了,我们选择四个,然后退回到一个


你也许可以通过玩弄它把限制推得更远,但我真的看不出重点:这个算法很难看,没有一大堆关于递归限制的注释,似乎没有动力;TS目前还没有完全做好准备。希望@ahejlsberg能让这一切变得更好,我能带着更好的消息回到这里

type StringToChars<T extends string> =
  string extends T ? string[] :
  T extends `${infer C0}${infer C1}${infer C2}${infer C3}${infer C4}${infer C5}${infer R}` ? [C0, C1, C2, C3, C4, C5, ...StringToChars<R>] :
  T extends `${infer C0}${infer C1}${infer C2}${infer C3}${infer R}` ? [C0, C1, C2, C3, ...StringToChars<R>] :
  T extends `${infer C0}${infer R}` ? [C0, ...StringToChars<R>] : []


type WorksWith80 = StringToChars<'12345678911234567892123456789312345678941234567895123456789612345678971234567898'>;
type Len80 = WorksWith80['length']; // 80

type BreaksWith81 = StringToChars<'123456789112345678921234567893123456789412345678951234567896123456789712345678981'>;
type Len81 = BreaksWith81['length']; // number