TypeScript中如何让一个类型属性的取值依赖另一个属性?
实现方案
要实现requiredFields的取值依赖于fields的实际元素,你需要给MyObject增加泛型参数来动态捕获fields的元素类型,再用该类型约束requiredFields:
type Form = { firstName: string lastName: string age: number } // 泛型T用于接收fields数组的元素联合类型,默认值为keyof Form兼容通用场景 type MyObject<T extends keyof Form = keyof Form> = { fields: T[] requiredFields: T[] }
使用示例
// 合法示例:requiredFields元素都在fields范围内 const validForm: MyObject<'firstName' | 'age'> = { fields: ['firstName', 'age'], requiredFields: ['firstName'] } // 非法示例:TS会直接抛出类型错误 const invalidForm: MyObject<'firstName' | 'age'> = { fields: ['firstName', 'age'], requiredFields: ['lastName'] // lastName不在fields的取值范围内 }
如果需要更自动的类型推导,不需要手动传入泛型,可以配合as const和satisfies实现自动校验:
const autoCheckForm = { fields: ['firstName', 'age'] as const, requiredFields: ['firstName'] } satisfies MyObject<typeof autoCheckForm.fields[number]>
这样TS会自动根据fields的字面量值校验requiredFields,无需手动声明泛型参数。
内容的提问来源于stack exchange,提问作者Stephan Olsen
相关产品推荐
相关产品推荐

