" Type Aliases"的示例代码上班

时间:2018-04-17 19:23:12

标签: typescript

以下示例代码来自the Handbook of TypeScript official site。它只描述了它的风格是什么样的,不起作用。实际的代码是如此复杂吗?我不知道如何键入属性与自身类型相同(类型LinkedList = T& {next:LinkedList})。

type LinkedList<T> = T & { next: LinkedList<T> };

interface Person {
    name: string;
}

var people: LinkedList<Person>;
var s = people.name;
var s = people.next.name;
var s = people.next.next.name;
var s = people.next.next.next.name;

2 个答案:

答案 0 :(得分:2)

可以使用严格的空值检查(响应@artem)来实现这样的类型。您不必使实际上无限,只有可能无限......例如循环。例如:

type LinkedList<T> = T & { next: LinkedList<T> };

interface Person {
  name: string;
}

// new LLP("name") produces a circular LinkedList<Person>
class LLP implements LinkedList<Person> {
  public next: LinkedList<Person>;
  constructor(public name: string, next?: LinkedList<Person>) {
    this.next = next ? next : this;
  }
}

var people: LinkedList<Person> = new LLP("Alice", new LLP("Bob", new LLP("Carol"));
console.log(people.name); // Alice
console.log(people.next.name); // Bob
console.log(people.next.next.name); // Carol
console.log(people.next.next.next.name); // Also Carol
console.log(people.next.next.next.next.name); // Forever Carol

我同意这是一种奇怪的类型;通常你可以选择next为可选方式来拯救,正如@artem所指出的那样。

答案 1 :(得分:0)

  

我不知道如何键入属性与自身类型相同(类型为LinkedList = T&amp; {next:LinkedList})。

type LinkedList<T> = T & { next: LinkedList<T> };

此示例假定--strictNullChecks已关闭,否则在不违反类型约束的情况下确实无法创建和对象 - 如果next不是,则此类型描述无限数据结构允许为undefined

但如果您将next声明为对列表中的下一项或undefined的引用,那么一切都很好:

type LinkedList<T> = T & { next: LinkedList<T> | undefined };

type Person = { name: string };

const personList: LinkedList<Person> =
        { name: 'Head', next: { name: 'Last', next: undefined } };