Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.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 - Fatal编程技术网

Typescript 如何摆脱用于固定循环类型引用的接口

Typescript 如何摆脱用于固定循环类型引用的接口,typescript,Typescript,我试图通过推断其元素类型来摆脱用作数组的接口 类型测试是(string | string[])[],但它应该是string[][] 我怎样才能解决这个问题 type test = MyType<{ type: 'array'; items: { type: 'array'; items: { type: 'string' } } }> type MyType<T> = T extends { type: 'string' } ? string : T exten

我试图通过推断其元素类型来摆脱用作数组的接口

类型测试
(string | string[])[]
,但它应该是
string[][]

我怎样才能解决这个问题

type test = MyType<{ type: 'array'; items: { type: 'array'; items: { type: 'string' } } }>

type MyType<T> = T extends { type: 'string' }
  ? string
  : T extends { type: 'array' }
  ? UnpackMyArray<T extends { items: infer Items } ? MyArray<Items> : never>
  : never

interface MyArray<Declaration> extends Array<MyType<Declaration>> {}
type UnpackMyArray<T> = T extends Array<infer Item> ? Item[] : never
type test=MyType
类型MyType=T扩展了{type:'string'}
? 一串
:T扩展{type:'array'}
? 解包数组
:从不
接口MyArray扩展数组{}
类型uncompmyarray=T扩展数组?项目[]:从不

我希望知道里面发生了什么,但我想不出来。通过在接口中包装一个本来被禁止的自引用条件类型,然后立即将其展开来绕过循环类型检测器是一个技巧,可能很脆弱。我已经看到了反对的警告;不确定这一次最终会如何,但我会对依赖它保持警惕。(请注意,如果您只是返回您的
MyArray
类型,这不会是一个问题……这里值得怀疑的是额外的展开)

无论如何,我试着分析它,但即使是对代码所做的微小更改,最终也会使编译器产生足够的混乱,从而在整个过程中输出像
any
这样的类型。最后,我重新创建了您的逻辑,并尽可能地删除了它,将其替换为。类型推断比属性查找更“神奇”,而且我对推断结果的信心不如查找。具体来说,我做了以下几类更改:

  • 而不是
    T扩展{prop:inferp}?P:
    我会使用
    T扩展{prop:unknown}?T['prop']:

  • 而不是
    T扩展数组?L:
    我会使用
    T扩展数组


    它完美吗?可能不会。你能指望它在新版本的TypeScript中继续工作吗?谁知道呢。从技术上讲,我是否用截至2019年4月26日在TS 3.3.3上运行的版本以及我的笔记本电脑上的TS的任何版本(TS 3.5.0-dev.20190424)回答了您的问题?嗯,是的


    希望有帮助;祝你好运。

    非常感谢!我太专注于
    推断
    ,因为TS经常会在我脸上爆炸,我用
    推断
    作为救援。你做了很好的调整-这很有帮助!
    type DeclarationType<D> = D extends { type: 'string' } ? string :
      (D extends { type: 'array', items: unknown } ? MyArray<D['items']> : never)[number][];
    
    interface MyArray<D> extends Array<DeclarationType<D>> { }
    
    type test = DeclarationType<{ 
      type: 'array'; items: { type: 'array'; items: { type: 'string' } } 
    }>