首页 > 解决方案 > 打字稿:将 keyof 与条件加通用子类型相结合

问题描述

在@jcalz 之后,我重写了这个问题。

请参阅此处的工作示例: TS Playground

我想安全地键入initFields下面的方法。以便

a) 仅接受字段prop(例如,pleaseIgnoreMe不允许使用该属性)。

b) 仅允许 Field 包含的类型为val。例如,bar1 只允许使用字符串

class Field<T> {
  constructor(public value: T) {}
}

class Item {
  initFields(fields: { [P in keyof this]?: any }) {
    Object.entries(fields).forEach(
      ([prop, val]) => ((this[prop as keyof this] as any) = new Field(val))
    );
  }
}
class Foo extends Item {
  bar1!: Field<string>;
  bar2!: Field<number>;
  pleaseIgnoreMe = "";

  init() {
    this.initFields({
      bar1: "foo",
      bar2: 42,
    });
  }
}

const foo = new Foo();
foo.init();
console.log(foo.bar1.value); // "foo"

标签: typescripttypestypescript-generics

解决方案


推荐阅读