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);