请问下: `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
子站问答
访问
宣传栏