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
部分