我有一个抽象类,在我传递泛型类型的方法中。接下来,我需要获取此项的属性,如何正确执行?
callback
答案 0 :(得分:8)
您的代码假定您的班级使用的每种类型T
都可能具有id
属性。
正如Jon Sharpe在你对你的问题的评论中指出的那样,无论是在类型安全性还是表现力方面,正确的方法是将这个假设声明为类型约束,使其明确并为类型检查器所知。 / p>
执行此操作的方法是在泛型类型参数上使用类型约束语法。
例如,你可以写
export interface MayHaveId {
id?: number; // you can use any type, number is just an example
}
export abstract class BaseService<T extends MayHaveId> {
saveItem(item: T) {
if (item.id !== undefined) {
console.log(item.id);
}
}
}
这里我们已经定义了一个接口来使代码更具可读性,但类型文字也可以使用。
请注意,id
属性被声明为可选属性,因为您的逻辑不要求它具有值。
如果您只打算将bass类与具有id
的类型参数一起使用,那么您应该使该属性成为必需属性。这将使代码更容易理解,并且会在编译时捕获更多错误,确保它首先仅用于此类类型。
Shahbaaz在评论中询问动态属性。
我们可以使用参数泛型类型
来定义具有动态属性的类型type WithProperty<K extends string, V = {}> = {
[P in K]: V
}
我们可以使用这种类型
function withProperty<T, K extends string, V> (x: T, properties: WithProperty<K, V>) {
return Object.assign(x, properties);
}
答案 1 :(得分:1)
在尝试获取值之前,您可以使用item.hasOwnProperty('id')。