如何在未知具体类型时确保类的两个成员类型一致?
解决类/接口中两个成员类型一致的问题
你之前尝试的循环引用写法行不通,因为TypeScript无法解析bar和baz互相依赖的类型定义,会导致推断陷入循环,最终得到无效的类型。下面是几种可行的解决思路:
1. 用泛型约束整个接口/类
给接口或类定义一个泛型参数,让需要保持一致的成员都使用这个泛型类型,这样不管具体类型是什么,两个成员的类型都会严格匹配:
接口示例
interface Foo<T> { bar: T; baz: T; } // 使用时指定具体类型 const strFoo: Foo<string> = { bar: "apple", baz: "banana" }; const numFoo: Foo<number> = { bar: 10, baz: 20 };
类示例
class Foo<T> { bar: T; baz: T; constructor(bar: T, baz: T) { this.bar = bar; this.baz = baz; } } // 自动推断泛型类型 const boolFoo = new Foo(true, false); // bar和baz都是boolean类型
2. 用类型别名配合satisfies关键字(灵活场景)
如果不想让整个接口带泛型,可以用类型别名定义约束,再通过satisfies让TS自动推断具体类型,同时保证结构合规:
type Foo<T = unknown> = { bar: T; baz: T; }; // 自动推断T为string,同时确保bar和baz类型一致 const validObj = { bar: "hello", baz: "world" } satisfies Foo; // 下面这种写法会报错,因为bar和baz类型不匹配 // const invalidObj = { bar: "hello", baz: 123 } satisfies Foo;
3. 针对已有类的约束方案
如果无法修改原类的定义,可以通过泛型函数来创建实例,强制保证两个成员的类型一致:
// 假设这是已有的类 class Foo { bar: unknown; baz: unknown; } // 用泛型函数封装创建逻辑 function createFoo<T>(bar: T, baz: T): Foo { const foo = new Foo(); foo.bar = bar; foo.baz = baz; return foo; } // 合法调用:bar和baz类型一致 const validFoo = createFoo("test", "demo"); // 非法调用:TS会直接报错 // const invalidFoo = createFoo("test", 123);
内容的提问来源于stack exchange,提问作者webdave_de
相关产品推荐
相关产品推荐

