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
相关产品推荐
相关产品推荐

