this.name
有问题,我该怎么办?
TS2322:类型 'string' 不可分配给类型 'NumberPropertyNames'。
type NumberPropertyNames<T> = { [K in keyof T]: T[K] extends Function ? K : never }[keyof T];
class User{
uid:1;
name:NumberPropertyNames<this>
login(){
this.name = 'uid';
}
}
答案 0 :(得分:0)
很高兴您选择了这个社区。我们将永远为您提供帮助。您的 Numbered 属性是一个很好的尝试,但您应该使用 as
运算符。
type NumberPropertyNames<T> = keyof {[P in keyof T as T[P] extends number ? P : never]: T[P]};
此功能没有很好的文档记录,但要了解什么是映射类型,请参阅 https://www.typescriptlang.org/docs/handbook/advanced-types.html#mapped-types。
那么,不要使用这种类型。使用用户类型。
type NumberedPropertiesInUser = NumberPropertyNames<User>;
// you will see IntelliSense in VS Code - press Ctrl and enter mouse to type NumberedPropertiesInUser
但是你不能直接在 User 中使用它 - 这将是一个循环。 (如果您不知道它是什么,请自行尝试。)因此您可以复制没有 name 属性的 User,然后使用该副本。
整个工作代码如下所示:
type NumberPropertyNames<T> = keyof {[P in keyof T as T[P] extends number ? P : never]: T[P]};
type NumberedPropertiesInUser = NumberPropertyNames<User>;
interface UserCopy extends Omit<User, "name"> {};
// Omit deletes a property or more when you use union like "a" | "b".
class User {
uid: 1;
name: NumberPropertyNames<UserCopy>;
login() {
this.name = 'uid';
}
}