在 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
这个例子是通用的和简单的,潜在的目标是更复杂的,但了解如何做到这一点很重要。
假设我有一个 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