在 Typescript 中,如何设置对象的类型以反映 class 的属性列表?

In Typescript, how do I set the type of an object to reflect a list of a class's properties?

这个例子是通用的和简单的,潜在的目标是更复杂的,但了解如何做到这一点很重要。

假设我有一个 class

class Foo {
  bar: string;
  baz: number;
  bob: any; // could be a function

  bad() {
    return true;
  };
}

我有一个功能

const init = (options: InitOptions, bar?: string, baz?: number, bob?: any) => {
  const foo = new Foo();
  foo.bar = bar ?? options.fallbacks.bar;
  foo.baz = baz ?? options.fallbacks.baz;
  foo.bob = bob ?? options.fallbacks.bob;
}

如何创建类型 InitOptions 使其像这样工作

type InitOptions = {
  fallbacks = {
    bar: string;
    baz: number;
  }
}

但不必重复我自己。前任。 fallbacks 应该是一个对象,其中每个键都是来自 Foo.

的 属性

是不是很简单?

class InitOptions 
{
  fallbacks: Foo;
}

澄清后更新:

{
  fallbacks: Pick<Foo, keyof Foo>;
}

为什么不使用旧的 OO 继承范例?

class Fooable {
  bar: string = '';
  baz: number = 0;
}

class Foo extends Fooable {
  bad() {
    return true;
  }
}

class InitOptions {
  fallbacks: Fooable = { bar: '', baz: 0 };
}

function init(options: InitOptions, bar?: string, baz?: number) {
  const foo = new Foo();

  foo.bar = bar ?? options.fallbacks.bar;
  foo.baz = baz ?? options.fallbacks.baz;

  console.log(`Initialized with bar: ${foo.bar}, baz: ${foo.baz}`);
}

init({ fallbacks: { bar: 'Hello', baz: 123 } });
init({ fallbacks: { bar: 'Hello', baz: 123 } }, 'World', 456);

当 运行 与 ts-node 10.2.1 时,它得到:

Initialized with bar: Hello, baz: 123
Initialized with bar: World, baz: 456