2 回答
TA贡献1951条经验 获得超3个赞
您可以定义一个接口,该接口具有类和传入的配置之间的所有公共属性obj,然后让您的类实现它,并且您的构造函数将该类型作为参数。
export interface IProvider {
activeAccount?: boolean;
description?: String;
name?: String;
providerType?: any;
publicUrl?: String;
uuid?: String;
}
export class Provider implements IProvider {
activeAccount: boolean;
description: String;
name: String;
providerType: any;
publicUrl: String;
uuid: String;
constructor(obj?: IProvider) {
if (obj) {
this.activeAccount = obj.activeAccount;
...
}
}
}
const provider = new Provider({...});
更新
如果不需要/任何属性,您可以在属性?名称和冒号之间的接口中添加一个。这样你就可以允许构造函数 obj 拥有它需要的尽可能多的有效道具,但如果你尝试传入它仍然会引发错误:
const provider = new Provider({ invalid: true });
查看打字稿接口了解更多信息
更新 2
把它放回到你原来的例子中:
let validData: any = {name: 'some name'}
let invalidData: any = {namexx: 'the key is invalid'}
let provider = Object.assign(new Provider(), validData)
let provider2 = Object.assign(new Provider(), invalidData)
定义两者validData和invalidDataasany将迫使 Typescript 不会用红色波浪线对你大喊大叫,因为它基本上是说“这可能是一个IProvider”。所以你应该设置validData: IProvider而不是any.
此外,Object.assign()将道具添加到类实例时也会发生同样的事情。如果您这样做,Typescript 似乎并不介意您尝试放入无效的道具:
const validData: IProvider = { name: 'some name' };
const invalidData: any = { namexx: 'the key is invalid' };
const provider: Provider = Object.assign(new Provider(validData), invalidData);
// Provider { name: 'some name', namexx: 'the key is invalid' }
但是,如果您再次更改any为IProvideron invalidData: IProvider,它会因为namexx那里的道具而对您大喊大叫。
话虽如此,既然输入和验证对你来说似乎很重要,那么你应该尝试确保所有类型都被明确声明以允许 Typescript 做它所做的事情。
添加回答
举报