打字稿:如何声明从属属性?

时间:2020-05-20 04:22:55

标签: typescript

我正在尝试为Quadstore库编写一个声明文件。该库定义了一个采用构造函数参数contextKey的类。此参数的值确定方法参数上的字段名称。简化,等效的Typescript为:

interface MethodArg {
  a: string;
  b: string;
  <<Whatever is supplied as the value of contextKey or a default name>>: string;
}

class A {
  constructor(options?: {contextKey: string}) {}

  fn(arg: MethodArg) {...}
}

如何声明MethodArg的类型,以说第三个属性名称取决于赋予类构造函数的值(在声明文件中)?这有可能吗?

1 个答案:

答案 0 :(得分:0)

我认为这是不可能的,因为我了解构造函数参数的 value 是在运行时定义的,但是MethodArg的类型是在编译时定义的(?),因此后者不能取决于前者,但是如果您希望将值提升为类型参数(从而提供运行时信息以编译时间),也许可以这样做

type MethodArg<E extends keyof any> = {
  [T in E]: string;
} & { a: string; b: string };

class A<T extends string> {
  constructor(options?: { contextKey: T }) {}
  fn(arg: MethodArg<T>) {}
}

new A({ contextKey: "foo" }).fn({
  a: "100",
  b: "100",
  foo: "foo",
});


// not the following way
let foo: string = "123";
new A({ contextKey: foo }).fn({
  a: "100",
  b: "200",
});