以下示例代码来自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;
答案 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 } };