Typescript 如何使用一些基本对象返回扩展对象';s值预填充?

Typescript 如何使用一些基本对象返回扩展对象';s值预填充?,typescript,Typescript,我有一个基本接口,另一个接口扩展了它。我正在尝试编写一个函数,它将从基接口获取一些参数,其中一些参数将被预填充。如果基本接口中不存在任何新属性,则也会将其作为参数接受,因为它们不能预先填充 接口Foo{ 道具:数字; 隐藏:数字; } 接口栏扩展了Foo{ 提案:1; 隐藏:2; newProp:string; } 常量createThing=({ 道具 休息 }:省略并拾取):T=>{ 返回{ 道具 hidden:3,//据我所知,您的createThing方法可以接受T的任何属性(Parti

我有一个基本接口,另一个接口扩展了它。我正在尝试编写一个函数,它将从基接口获取一些参数,其中一些参数将被预填充。如果基本接口中不存在任何新属性,则也会将其作为参数接受,因为它们不能预先填充

接口Foo{
道具:数字;
隐藏:数字;
}
接口栏扩展了Foo{
提案:1;
隐藏:2;
newProp:string;
}
常量createThing=({
道具
休息
}:省略并拾取):T=>{
返回{
道具

hidden:3,//据我所知,您的
createThing
方法可以接受T的任何属性(
Partial
),并且它需要包含任何新属性,这些属性不是Foo的一部分(
ommit
)。也就是说

type Props<T extends Foo> = Partial<T> & Omit<T, keyof Foo>;
在这一点上,我仍然得到
'T'可以用约束'Foo'的不同子类型实例化
消息,但是我可以用
作为T
使它安静下来,因为我不能传递
showerddefaults
Props
中隐藏的无效值

const fooDefaults:Foo={
道具:1,,
隐藏:5,
}
const createThing=(tDefaults:slowedDefaults)=>(props:props):T=>{
返回{
…默认值,
…t结果,
…道具,
}as-T;
};
const createBar=createThing({
道具:1,,
隐藏:2,
});
constthing=createBar({prop:1,newProp'foo'});

现在还不清楚您在这里想要实现什么。这似乎是您想要的。尽管我想做一些不同的事情(我不想将默认的预填充道具公开给函数参数),但您是对的。如果它不知道扩展接口将具有相同的道具,则没有其他方法可以执行此操作。我将此标记为已解决。编辑:谢谢!
type NarrowedKeys<T extends Foo> = {
    // there's probably a cleaner way to write this
    [K in keyof T]: K extends keyof Foo ? Foo[K] extends T[K] ? never : K : never
}[keyof T];

type NarrowedDefaults<T extends Foo> = Pick<T, NarrowedKeys<T>>
const fooDefaults: Foo = {
    prop: 1,
    hidden: 5,
}

const createThing = <T extends Foo>(tDefaults: NarrowedDefaults<T>) => (props: Props<T>): T => {
    return {
        ...fooDefaults,
        ...tDefaults,
        ...props,
    } as T;
};

const createBar = createThing<Bar>({
    prop: 1,
    hidden: 2,
});
const thing = createBar({prop: 1, newProp: 'foo'});