仅返回提供的键的部分类型的泛型函数的返回类型是什么?

时间:2020-09-28 15:57:01

标签: typescript typescript-generics

所以我的目标是拥有这样的东西,使得返回类型仅包含传递给函数的键:

function doTheThings<T, U = Partial<T>>(values: U): { [P in keyof U]: U[P] };

目前,我得到的是假设我的参数和返回类型都是独立的Partial<T>,因此参数上不存在的键在返回类型上可用,如下所示:

type Thing = { name: string, age: number };
const seuss = doTheThings<Thing>({ name: 'seuss'});

// Should work, but TypeScript raises error
//   Type 'string | undefined' is not assignable to type 'string'.
//   Type 'undefined' is not assignable to type 'string'.
const name: string = seuss.name;

// Should work, but TypeScript raises error
//   Type 'number | undefined' is not assignable to type 'undefined'.
//   Type 'number' is not assignable to type 'undefined'.
const age: undefined = seuss.age;

我今天是否正在尝试使用TypeScript做些什么?

查看游乐场: https://www.typescriptlang.org/play?#code/GYVwdgxgLglg9mABAEzgFQBYFNMzAcwGcAeNAGkQFVEBeRABQEMAnWRgG1ID4uAKANw4gshAFxUAlOIDeiANr1EeRAGssATzjAqAXXGUFOxAF9E0gFCJEzLFBDMkg9sMIBuc8fPmo6gA5ZEXAJaM0QwRgBbLHFCKGY8fApGfGiwkAiAIyxmE3dzCARYxEIsEEJCENRMHAwEkiD8PllwqPEAchKywjbjCTyAen7EKFqKp2FijDgQdmRELMRGYriE4rwIAJgoRAB3Rgr152QsOf3FpBZ8dKwwbag4YexEUEhYBHzC7ZbU2Pjguk65QAdN8BkMRjAxkIAoQpjM5gtwMdgHgTmtIJttnsKmA4NtDiBjqcKowLswrlFbsMHiMAi9oPAwB8wEVkqkkVgUWA0QDSsC2e4gA

1 个答案:

答案 0 :(得分:2)

问题在于推断如何与显式和默认类型参数一起工作。如果指定一个类型参数,则其余参数将不会进行推断(将使用其默认值)

通常的解决方法是使用函数currying:

function doTheThings<T>() {
  return function <U extends  Partial<T>>(values: U): U {
    return values;
  }
}

type Thing = { name: string, age: number };

const seuss = doTheThings<Thing>()({ name: 'seuss'});

// this value should be a string since it was included as an argument to the function
const name: string = seuss.name;

//  error age does not exist 
const age: undefined = seuss.age;

Playground Link

上面的函数将仅返回带有传入键的对象。如果您还希望保留未传递的键,则可以与Partial<T>相交:

function doTheThings<T>() {
  return function <U extends  Partial<T>>(values: U): U & Partial<T> {
    return values;
  }
}

const age: number | undefined = seuss.age;

Playground Link