如何让TypeScript自动更新接口中回调参数为可选函数返回类型?
如何声明关联
dataFormat返回值与render参数类型的Column接口 要实现你需要的类型关联(当存在dataFormat时,render的参数自动匹配其返回值类型),可以通过联合类型区分不同使用场景,让TypeScript自动推断对应类型:
interface A { /* 你的A接口定义 */ } type Column<T> = // 场景1:仅使用render,参数为原始数据类型T { render: (data: T) => void; dataFormat?: never } // 场景2:同时使用dataFormat和render,render参数自动匹配dataFormat的返回值 | { dataFormat: (rawData: T) => infer U; render: (formatedData: U) => void }; // 测试用例1:仅render,参数类型为A const c1: Column<A> = { render(data) { // data: A } }; // 测试用例2:同时使用dataFormat和render,render参数自动推断为{ a: number } const c2: Column<A> = { dataFormat(rawData) { // rawData: A return { a: 1 }; }, render(formatedData) { // formatedData: { a: number } } };
说明:
- 联合类型第一个分支对应仅使用render的场景,
dataFormat被标记为never,意味着不能传入该属性,符合可选且不冲突的要求。 - 第二个分支通过
infer U自动提取dataFormat的返回值类型,让render的参数类型与之绑定,无需手动指定泛型。 - 如果需要支持仅使用dataFormat的场景,可以添加第三个分支:
{ dataFormat: (rawData: T) => void; render?: never }
另外,如果你希望更灵活的泛型声明(允许手动指定格式化后类型),也可以使用双泛型接口:
interface Column<T, U = T> { dataFormat?: (rawData: T) => U; render: (data: U) => void; } // 仅render,U默认为A const c1: Column<A> = { render(data) { /* data: A */ } }; // 手动指定格式化后类型,TS会校验dataFormat的返回值是否匹配 const c2: Column<A, { a: number }> = { dataFormat(rawData) { return { a: 1 }; }, render(formatedData) { /* formatedData: { a: number } */ } };
内容的提问来源于stack exchange,提问作者aweiu
相关产品推荐
相关产品推荐

