Typescript从函数返回中提取类型 (By Gemini 2.5 Pro)
可以使用 TypeScript 的 ReturnType 和 条件类型 (Conditional Types) 配合 infer 关键字来从函数的返回类型中提取 Promise 内的数据类型,而无需显式定义 data 的类型。
方法
假设你的函数是这样的:
function fetchData() {
return Promise.resolve({ name: 'Alice', age: 30 }); // 这里的 { name: 'Alice', age: 30 } 就是未显式定义的 data
}
你可以通过以下步骤来获取 data 的类型:
- 获取函数的返回类型: 使用
ReturnType<typeof fetchData>来获取fetchData函数的返回类型,在这个例子中是Promise<{ name: string; age: number; }>。 - 提取 Promise 内的类型: 定义一个条件类型来提取
Promise包裹的类型。
下面是具体的实现:
// 1. 你的异步函数
async function fetchData() {
// 假设这里有一些异步操作
return {
id: 1,
title: 'TypeScript Rocks!',
completed: false,
details: {
author: 'Unknown',
tags: ['typescript', 'promise', 'utility-types']
}
};
}
// 2. 使用 ReturnType 获取函数 fetchData 的返回类型 (即 Promise<data>)
type FetchDataReturnType = ReturnType<typeof fetchData>;
// FetchDataReturnType 的类型是: Promise<{ id: number; title: string; completed: boolean; details: { author: string; tags: string[]; }; }>
// 3. 定义一个工具类型来提取 Promise 中的泛型类型
type UnpackPromise<T> = T extends Promise<infer U> ? U : T;
// 4. 使用 UnpackPromise 工具类型来获取 data 的实际类型
type DataType = UnpackPromise<FetchDataReturnType>;
// DataType 的类型现在是: { id: number; title: string; completed: boolean; details: { author: string; tags: string[]; }; }
// 现在你可以使用 DataType 了
const myData: DataType = { // TypeScript 会进行类型检查
id: 2,
title: 'Another Post',
completed: true,
details: {
author: 'Jane Doe',
tags: ['example']
}
};
console.log(myData);
// 如果你尝试给 myData 赋一个不符合推断出来的类型的对象,TypeScript 会报错:
// const wrongData: DataType = {
// name: 'Test' // Error: Property 'id' is missing in type '{ name: string; }' but required in type '{ id: number; title: string; completed: boolean; details: { author: string; tags: string[]; }; }'.
// };
解析
typeof fetchData: 获取fetchData函数的类型。ReturnType<Type>: 这是一个 TypeScript 内置的工具类型,它会获取函数类型Type的返回类型。type UnpackPromise<T> = T extends Promise<infer U> ? U : T;:- 这是一个条件类型。
T extends Promise<infer U>: 判断类型T是否可以赋值给Promise<infer U>。infer U: 这是关键。如果T的确是一个Promise,TypeScript 会尝试推断Promise的泛型参数U的类型,并将这个推断出来的类型赋给U。
? U: 如果条件为真(即T是一个Promise),则UnpackPromise<T>的类型就是推断出来的U(也就是Promise内部data的类型)。: T: 如果条件为假(即T不是一个Promise),则UnpackPromise<T>的类型就是T本身(这个回退逻辑可以根据你的具体需求调整,比如返回never)。
通过这种方式,你就不需要预先定义 data 的接口或类型,TypeScript 会自动从你的函数实现中推断出它的结构。这在处理一些动态返回或者你不想显式维护返回类型的场景下非常有用。

浙公网安备 33010602011771号