Вы можете использовать дженерики, если вы действительно хотите принять что-либо, что расширяет 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.");
}
Типографский щит has
может использоваться для безопасного доступа к любому свойству, для которого вы можете проверить .
Однако, если вы уже ожидаете, что свойство bar
будет частью объекта, вы также можете указать это в сигнатуре типа без обобщения:
const myFun = (fooOrFooBar: IFoo | IFooBar) => {
console.log(fooOrFooBar.foo);
console.log('bar' in fooOrFooBar ? fooOrFooBar.bar : "I do not have bar.");
}
Это все еще позволяет передавать все, что расширяет IFoo
:
const x = { foo: "fsd", x: 'sdf'}
myFun(x);