类型别名循环引用自身

Tom*_*ett 4 typescript

为什么这样做:

type Foo = { x: Foo }
Run Code Online (Sandbox Code Playgroud)

但这不是:

type Bar<A> = { x: A }
type Foo = Bar<Foo>
//   ^^^ Type alias 'Foo' circularly references itself
Run Code Online (Sandbox Code Playgroud)

它们不应该是等价的吗?

Nit*_*mer 7

好吧,即使您不使用约束,第二个也会失败:

type Bar<A> = { x: string }
type Foo = Bar<Foo> // still fails with the same message
Run Code Online (Sandbox Code Playgroud)

基本上,第二种形式需要是这样的:

type Bar = { x: Foo }
type Foo = Bar;
Run Code Online (Sandbox Code Playgroud)

相当于第一个。

另外,strictNullChecks我很确定没有办法初始化这样的类型。

  • 我不得不说它非常奇怪`type Test=string |Record&lt;string,Test&gt; // 不起作用`但是`type Test=string | { [键:字符串 | number]:测试 }` 有效,哈哈 (3认同)

Sea*_*mus 6

根据文档,类型别名可以在属性中引用自身,但不能在声明右侧的任何其他地方引用:

我们还可以在属性中使用类型别名来引用自身

所以,正如你所指出的,这有效:

type Foo = { x: Foo }
Run Code Online (Sandbox Code Playgroud)

但是,类型别名不可能出现在声明右侧的其他任何地方

但这失败了:

type Foo = Bar<Foo>
Run Code Online (Sandbox Code Playgroud)

  • 多亏了这个,我实际上使用接口解决了它......我有`type Foo = Record&lt;string, string | Foo&gt;` ,我遇到了错误,用 `interface Foo { [key: string]: string | 解决了 福}`。我仍然认为应该没有区别,但对我来说没关系...... (12认同)