考虑这个类:
export const CreditRiskRatingKeys: (keyof CreditRiskRating)[] =
[
'applicant_id',
'is_dirty'
];
export class CreditRiskRating {
applicant_id: string = '';
is_dirty: boolean = false;
fillQuestionDictionaryToModel() {
for (const key of CreditRiskRatingKeys) {
this[key] = 'test' as any ; // Error: Type 'any' is not assignable to type 'never'
}
}
}
Key
已经是 CreditRiskRating
的键,并且 this
指的是同一个类。那为什么this[key] = 'test';
要抱怨呢?我在这里缺少什么?
TypeScript 不会分析
CreditRiskRatingKeys
中定义的属性的值类型来尝试确定您是否为给定属性分配了正确的值类型。
一种解决方案是引入一种
Property
类型来限制列出的属性的值类型:
export type Property<T, U> = {
[K in keyof T]: T[K] extends U ? K : never
}[keyof T];
export const CreditRiskRatingKeys: Property<CreditRiskRating, string>[] = [
'applicant_id'
] as const;
export class CreditRiskRating {
applicant_id: string = '';
fillQuestionDictionaryToModel() {
let f = this[CreditRiskRatingKeys[0]];
for (const key of CreditRiskRatingKeys) {
this[key] = 'test';
}
}
}
类型
keyof CreditRiskRating
不仅是applicant_id
,而且还是fillQuestionDictionaryToModel
。 JS 中的方法和属性之间没有真正的区别。
因此,尽管
CreditRiskRatingKeys
是一个只有值 applicant_id
的数组,但根据类型,它可以是具有 'applicant_id'
和/或 'fillQuestionDictionaryToModel'
的数组。因此 typeof this[key]
可以是字符串或函数 () => void
。
要解决此问题,您可以创建一个新的实用程序类型
PropertyOf
排除方法:
type PropertyOf<T> = {
[K in keyof T]: T[K] extends Function ? never : K
}[keyof T];
并将其用作
export const CreditRiskRatingKeys: PropertyOf<CreditRiskRating>[] = [
'applicant_id'
];
export class CreditRiskRating {
applicant_id: string = '';
fillQuestionDictionaryToModel() {
for (const key of CreditRiskRatingKeys) {
this[key] = 'test';
}
}
}