You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中类属性结合泛型、unknown与any的使用及实例化指定类型的实现问询

TypeScript中类属性结合泛型、unknown与any的使用及实例化指定类型的实现问询

我懂你的需求啦——你现在是想用unknown定义类型属性来保证安全,但又希望创建实例的时候能给这些属性指定具体的类型,不用每次都做麻烦的类型断言对吧?其实这里用泛型来替代unknown是更合适的方案,既能保留类型安全,又能在实例化时灵活指定类型,完美解决你的问题。

先把你给出的代码补全(假设未写完的TDE是type TDE = { type: string; };),然后给你改造一下:

用泛型重构类型定义

我们给TVertex和TEdge加上泛型参数,分别对应它们的data属性类型,TGraph也跟着适配:

// 泛型V代表顶点data的类型,泛型E代表边data的类型
type TGraph<V, E> = {
  id: string;
  vertices: TVertex<V, E>[];
  addVertex(v: TVertex<V, E>): void;
};

type TVertex<V, E> = {
  id: string;
  edges: TEdge<V, E>[];
  data: V; // 用泛型V替代unknown,实例化时指定具体类型
  addEdge(d: E): void; // 边的data类型绑定泛型E
};

type TEdge<V, E> = {
  id: string;
  start: TVertex<V, E>;
  data: E; // 同样用泛型E替代unknown
};

// 你定义的顶点数据类型和边数据类型
type TDV = { name: string; };
type TDE = { type: string; };

实例化时指定具体类型

现在创建实例的时候,直接明确顶点data用TDV、边data用TDE,所有相关属性都会自动匹配类型,不用再手动断言:

// 创建顶点实例,指定data类型为TDV
const vertex1: TVertex<TDV, TDE> = {
  id: "v1",
  edges: [],
  data: { name: "Vertex A" }, // 这里自动校验必须符合TDV结构
  addEdge(d) {
    // d的类型自动是TDE,写代码时能拿到完整的类型提示
    const newEdge: TEdge<TDV, TDE> = {
      id: `e-${this.edges.length + 1}`,
      start: this,
      data: d
    };
    this.edges.push(newEdge);
  }
};

// 创建Graph实例,绑定V=TDV,E=TDE
const graph: TGraph<TDV, TDE> = {
  id: "g1",
  vertices: [vertex1],
  addVertex(v) {
    this.vertices.push(v);
  }
};

为什么不推荐一直用unknown?

如果坚持用unknown,每次访问data属性都得手动做类型断言,比如:

// 用unknown的场景,必须断言才能访问属性
const vertexName = (vertex1.data as TDV).name;

这种写法不仅繁琐,还容易因为断言错误导致运行时问题,而泛型能在定义阶段就把类型绑定好,全程有TypeScript的校验和提示,安全性和开发体验都好很多。

额外小技巧

如果你的场景里偶尔不需要指定具体类型,也可以给泛型设置默认值,兼容原来的unknown用法:

type TVertex<V = unknown, E = unknown> = {
  // ... 原有结构
};

这样在不指定泛型参数时,data会默认是unknown,灵活度拉满~

备注:内容来源于stack exchange,提问作者rans

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 16:24:48