打字稿只允许来自另一个对象的键

Dav*_*ker 4 typescript

我一直在尝试键入一个将在子类中定义为对象文字的属性,该对象必须只包含存在于泛型类型中的键。

例如,我有以下基本结构

interface UserType {
    name: string;
}

class Model<T> {
    protected casts: object
}

class User extends Model<UserType> {
}
Run Code Online (Sandbox Code Playgroud)

我试图确保protected casts模型的属性可能只包含泛型类中存在的键,在这种情况下,只name应允许作为casts属性的键。

我首先认为我可以使用 keyof

protected casts: {[k: keyof T]: string}
Run Code Online (Sandbox Code Playgroud)

然而,打字稿正确地告诉我,k只能有一个stringor类型number

有没有办法可以达到我想要的结果?

jca*_*alz 6

当然,您可以使用TypeScript 标准库中Record<K,V>类型。它是一个映射类型,它表示一个对象,其键和值是:KV

class Model<T> {
    protected casts: Record<keyof T, object>
}
Run Code Online (Sandbox Code Playgroud)

您可以验证这里面Userthis.casts有一个name类型的属性object

希望有所帮助;祝你好运!