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

请问下:
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' },
};
阅读 2k
2 个回答

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

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

type N1 = Edge1<number>; // ok
type N2 = Edge2<number>; // error

你这个例子好像没区别,都是兼容的对象数据类型。

如果写了 D extends PlainObject 在泛型里面,需要传入的类型是它的上层类型。即要包函兼容它才行。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Microsoft
子站问答
访问
宣传栏