Typescript 从对象属性设置变量类型

Typescript 从对象属性设置变量类型,typescript,Typescript,我试图将变量的类型设置为对象的属性,如下面的代码中所示 class-Foo{ } 常量对象={ 福, }; 常量foo:foo;//有效的 常数条:obj.Foo;//找不到命名空间“obj”。 这给了我一个错误找不到命名空间“obj”。有没有一种方法可以从对象属性设置变量的类型,使得foo和bar属于foo类型?您可以这样紧凑地分配类型让bar:{foo} 更新 另外,因为我提到了obj不是名称空间,所以我尝试了typeof关键字,因为我们需要该属性的type。所以你可以像这样试试 let

我试图将变量的类型设置为对象的属性,如下面的代码中所示

class-Foo{
}
常量对象={
福,
};
常量foo:foo;//有效的
常数条:obj.Foo;//找不到命名空间“obj”。

这给了我一个错误
找不到命名空间“obj”
。有没有一种方法可以从对象属性设置变量的类型,使得
foo
bar
属于
foo
类型?

您可以这样紧凑地分配类型
让bar:{foo}

更新

另外,因为我提到了
obj
不是名称空间,所以我尝试了
typeof
关键字,因为我们需要该属性的
type
。所以你可以像这样试试


let bar:typeof obj.Foo

您可以这样紧凑地分配类型:{code>let bar:{Foo}

更新

另外,因为我提到了
obj
不是名称空间,所以我尝试了
typeof
关键字,因为我们需要该属性的
type
。所以你可以像这样试试


let bar:typeof obj.Foo

无法将类型添加到对象类型。您可以做的最接近的事情是使用名称空间定义。命名空间可以同时具有变量和类型。命名空间在运行时表示为对象,因此它可能足够接近您需要的内容:

class Foo {

}
type _Foo = Foo;
const _Foo = Foo;
namespace obj {
    export type Foo = _Foo;
    export const Foo = _Foo; // to allow instantiation through obj.Foo
};

const foo: Foo; // valid
const bar: obj.Foo = new obj.Foo()

无法将类型添加到对象类型。您可以做的最接近的事情是使用名称空间定义。命名空间可以同时具有变量和类型。命名空间在运行时表示为对象,因此它可能足够接近您需要的内容:

class Foo {

}
type _Foo = Foo;
const _Foo = Foo;
namespace obj {
    export type Foo = _Foo;
    export const Foo = _Foo; // to allow instantiation through obj.Foo
};

const foo: Foo; // valid
const bar: obj.Foo = new obj.Foo()

首先需要获取
obj
(使用
typeof
)的类型,然后可以查询其
Foo
属性类型:

declare const bar: (typeof obj)["Foo"];
注意
bar
constructor
,而不是实例

如果要查找实例类型,可以使用实用程序:

declare const bar:InstanceType;
如果您需要更具可重用性的产品:

type Obj = typeof obj;
type GetType<K extends keyof Obj> = InstanceType<Obj[K]>

const bar: GetType<'Foo'> = new obj.Foo();
type Obj=Obj的类型;
类型GetType=InstanceType
常量栏:GetType=new obj.Foo();

首先需要获取
obj
的类型(使用
typeof
),然后可以查询其
Foo
属性类型:

declare const bar: (typeof obj)["Foo"];
注意
bar
constructor
,而不是实例

如果要查找实例类型,可以使用实用程序:

declare const bar:InstanceType;
如果您需要更具可重用性的产品:

type Obj = typeof obj;
type GetType<K extends keyof Obj> = InstanceType<Obj[K]>

const bar: GetType<'Foo'> = new obj.Foo();
type Obj=Obj的类型;
类型GetType=InstanceType
常量栏:GetType=new obj.Foo();


这并不能回答我的问题。这只是说,
bar
是一个具有
any
@sebastiaanny类型的属性
Foo
的对象,因为
obj
不是一个名称空间(即
class
接口
),因此无法将该类型设置为对象的属性。另外,因为
obj.value
语法get是属性的值,而不是它的值type@SebastiaanYN我已经更新了答案。请现在查看
const bar:typeof obj.Foo=new obj.Foo()
会给出
属性'prototype'在类型'Foo'中缺失,但在类型'typeof Foo'中是必需的。
@Sebastiaanny我也在TS中得到了错误,但是如果运行代码并看到控制台,它确实创建了
Foo
对象,并且在浏览器中没有错误(奇怪),这并不能回答我的问题。这只是说,
bar
是一个具有
any
@sebastiaanny类型的属性
Foo
的对象,因为
obj
不是一个名称空间(即
class
接口
),因此无法将该类型设置为对象的属性。另外,因为
obj.value
语法get是属性的值,而不是它的值type@SebastiaanYN我已经更新了答案。请现在查看
const bar:typeof obj.Foo=new obj.Foo()
会给出
属性'prototype'在类型'Foo'中缺失,但在类型'typeof Foo'中是必需的。
@Sebastiaanny我也在TS中得到了错误,但是如果运行代码并看到控制台,它确实创建了
Foo
对象,并且在浏览器中没有错误(奇怪),这是可行的,但是有没有办法缩小这个尺寸呢?我正在处理90~classes@SebastiaanYN问题是您使用的是相同的名称,因此外部名称将有别名,因此需要外部的
\uuu
定义。您还需要同时导出类型和值(
const
),以使类与以前完全一样工作。。考虑到这些限制,我不确定我将如何减少它。这是可行的,但是有没有办法减小它的大小?我正在处理90~classes@SebastiaanYN问题是您使用的是相同的名称,因此外部名称将有别名,因此需要外部的
\uuu
定义。您还需要同时导出类型和值(
const
),以使类与以前完全一样工作。。考虑到这些约束条件,我不确定我将如何减少它。这也可以起作用,但是声明
const-bar:obj.Foo
(正如我认为用户所期望的那样)将是
declare-const-bar:InstanceType
一点点。谢谢,刚才还添加了
InstanceType
也可以起作用的部分,但是声明
const-bar:obj.Foo
(正如我认为用户所期望的那样)将是
declare-const-bar:InstanceType
一口之多。谢谢,刚才还添加了
InstanceType
部分