为什么会有错误?我应该怎么办?

时间:2021-01-23 14:25:42

标签: typescript types typescript-typings

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';
  }
}

1 个答案:

答案 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

IntelliSense

但是你不能直接在 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';
    }
}