Typescript 实现接口或接口扩展的函数参数

Typescript 实现接口或接口扩展的函数参数,typescript,interface,Typescript,Interface,我有以下代码: 接口IFoo{ foo:string; } 接口IFooBar扩展了IFoo{ 酒吧:字符串; } const myFun=(fooOrFooBar:IFoo)=>{ console.log(fooOrFooBar.foo); log(foooorfoobar.bar | | |“我没有酒吧”); } const myFoo:IFoo={ 福:“你好”, } 常量myFooBar:IFooBar={ 福:“你好”, 酒吧:“世界!”, } myFun(myFoo); myFun(

我有以下代码:

接口IFoo{
foo:string;
}
接口IFooBar扩展了IFoo{
酒吧:字符串;
}
const myFun=(fooOrFooBar:IFoo)=>{
console.log(fooOrFooBar.foo);
log(foooorfoobar.bar | | |“我没有酒吧”);
}
const myFoo:IFoo={
福:“你好”,
}
常量myFooBar:IFooBar={
福:“你好”,
酒吧:“世界!”,
}
myFun(myFoo);
myFun(myFooBar);

这将允许我将对象传递给这个函数,该函数要么实现
IFoo
,要么实现
IFoo
的扩展,并以不同的方式处理它们。但是,上面的代码不会编译,因为类型“IFoo”上不存在属性“bar”。是否有一种方法可以定义函数,使其接受实现
IFoo
的参数或扩展
IFoo
的任何接口?

如果您确实希望接受扩展
IFoo
的任何内容,则可以使用泛型:

const has = <K extends string>(
  key: K,
  x: object,
): x is { [key in K]: unknown } => (
  key in x
);

const myFun = <T extends IFoo>(fooOrFooBar: T) => {
  console.log(fooOrFooBar.foo);
  console.log(has('bar', fooOrFooBar) ? fooOrFooBar.bar : "I do not have bar.");
}
这仍然允许传递任何扩展
IFoo

const x = { foo: "fsd", x: 'sdf'}
myFun(x);

如果您知道要提前访问这些道具,并且它们可以是参数的一部分,那么为什么不相应地键入参数呢?e、 g
constmyfun=(fooOrFooBar:IFoo&Partial)
const x = { foo: "fsd", x: 'sdf'}
myFun(x);