interface Instance {
[param: string]: string;
}
const checkRequiredProps = (instance: Instance, requiredProps: string[]) => {
const props = requiredProps.filter((prop: string) => {
return !instance[prop];
});
console.log(props);
};
interface IHuman {
name: string;
}
class Test {
private readonly _name: string;
constructor(human: IHuman = {} as IHuman) {
checkRequiredProps(human, ['name']);
this._name = human.name;
}
public get name(): string {
return this._name;
}
}
const test = new Test({ name: 'loki' });
我有2种类型Instance
,这是一个具有任意键值对的简单对象。还有IHuman
,其中包含name
属性。我试图将IHuman
传递给接受Instance
的函数。如图所示,我得到了错误。
但是当我将IHuman
从界面更改为type
时。错误消失了。
type IHuman = {
name: string;
}
什么是错误,为什么在第二种情况下消失了。有没有更好的方法来键入Instance
。我希望Instance
是可以接受任何对象的常规类型。有更好的方法吗?
答案 0 :(得分:0)
我相信这是因为TypeScript中的interface
无法像其他更通用的接口一样被鸭子式输入。您可以IHuman
扩展Instance
以使其起作用,但是您可能不想为要在其上运行checkRequiredProps
的每个接口都这样做。
编辑:从下面的注释中,checkRequiredProps
的功能签名被更改为具有string
s且可以为any
类型的键的对象。这仍将允许输入数组,但是字符串,布尔值,null
和undefined
应该无法传递。
const checkRequiredProps = (instance: {[key: string]: any}, requiredProps: string[]) => {
const props = requiredProps.filter((prop) => {
return !instance[prop];
});
console.log(props);
};
interface IHuman {
name: string;
}
interface IWerewolf {
name: string;
}
class Test {
private readonly _name: string;
constructor(human: IHuman = {} as IHuman, werewolf: IWerewolf = {} as IWerewolf) {
checkRequiredProps(human, ['name']);
checkRequiredProps(werewolf, ['name']);
this._name = human.name;
}
public get name(): string {
return this._name;
}
}
const test = new Test({ name: 'loki' }, { name: 'wolfington' });
添加了另一个interface
,以确保狼人享有与人类相同的权利。
答案 1 :(得分:0)
[531-660j, 267-801j,...]