所以我的目标是拥有这样的东西,使得返回类型仅包含传递给函数的键:
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做些什么?
答案 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;
上面的函数将仅返回带有传入键的对象。如果您还希望保留未传递的键,则可以与Partial<T>
相交:
function doTheThings<T>() {
return function <U extends Partial<T>>(values: U): U & Partial<T> {
return values;
}
}
const age: number | undefined = seuss.age;