请问下: `interface Edge1<D>` `interface Edge1<D extends PlainObject>` 有什么区别?

作者站长头像
站长
· 阅读数 6

请问下:interface Edge1<D> interface Edge1<D extends PlainObject> 有什么区别?

interface PlainObject {
  [key: string]: unknown;
}

interface User {
  id: number;
  name: string;
  email: string;
}

interface Edge1<D> {
  id: string;
  source: string;
  target: string;
  data: D;
}

interface Edge2<D extends PlainObject> {
  id: string;
  source: string;
  target: string;
  data: D;
}

const edge1: Edge1<User> = {
  id: '1',
  source: 'user-1',
  target: 'user-2',
  data: { id: 1, name: 'John', email: 'john@example.com' },
};

const edge2: Edge2<User> = {
  id: '2',
  source 'user-2',
  target: 'user-3',
  data: { id: 2, name: 'Tom', email: 'tom@example.com' },
};
回复
1个回答
avatar
test
2024-07-02

一个没有泛型约束,一个有泛型约束,仅此而已。

后者要求泛型 D 必须是个 PlainObject。所以你不能拿 number、string、boolean 之类的类型用。

type N1 = Edge1<number>; // ok
type N2 = Edge2<number>; // error
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容