您好,我使用的是 typescript 2.1.4
,但遇到了这个问题。
假设我有一个看起来像这样的对象
interface IObj{
key1:ISubObj;
}
interface ISubObj{
exp:RegExp;
method:(param:string)=>boolean
}
const obj:IObj={
key1: {
exp: /someexp/i,
method: somemethod
}
}
和somemethod
看起来像这样
function somemethod(regexp){
return function(param){
return regexp.test(param)
}
}
在类型脚本中,我创建了一个如下所示的类
export class someClass {
constructor(obj) {
for (let k in obj) {
this[k]=obj[k].method(obj[k].exp)
}
return this;
}
}
export const Foo = new someClass(obj);
我遇到的问题是,它解析为有效的 javascript
但是,使用 Foo.key1(param)
返回类型 error
。 Foo 上不存在 key1
。
我在类上使用了 implements someInterface
,但只有当我使用 key1
作为可选时,该接口(interface)才有效。我不想使用可选语法
interface someInterface {
key1?:(param:string)=>boolean
}
export class someClass implements someInterface{...}
有没有办法在动态构造的类上创建有效类型?
编辑
更正了 obj 未传递到构造函数中的拼写错误
编辑
使用@toskv回答,我稍微改变了我的解决方案以获得我想要的效果。但这可能不是最好的方法
interface IObj{
key1:ISubObj;
}
interface ISubObj{
exp:RegExp;
method:(param:string)=>boolean
}
const obj:IObj={
key1: {
exp: /someexp/i,
method: somemethod
}
}
export interface ISomeClass{
key1:(str:string)=>boolean;
}
export type TSomeClass<T> = {
[P in keyof T]?=T[P]
}
export class someClass {
constructor(obj) {
for (let k in obj) {
this[k]=obj[k].method(obj[k].exp)
}
return this;
}
}
export const Foo:TSomeClass<ISomeClass> = new someClass(obj);
最佳答案
可能有更好的方法来做到这一点,但这里有一些可以开始的东西。
您可以使用2.1中添加的mappedTypes来创建基于IObj接口(interface)的新类型。
interface IObj {
key1: ISubObj;
}
interface ISubObj {
exp: RegExp;
method: (param: string) => boolean
}
type Result = {
// must be optional so we can initialize it with nothing
[P in keyof IObj]?: boolean
}
class Mine {
// it's not really a property of the class but hey it's typed
public results: Result = {};
constructor(obj: IObj) {
for (let k in obj) {
this.results[k] = obj[k].method(obj[k].exp)
}
return this;
}
}
// autocomplete and everything
new Mine(null).results.key1
Here这是 Playground 上的一个例子。
您可以在2.1 release notes中阅读有关映射类型的更多信息。 .
在这种情况下,该类实际上没有意义。转换数据的函数也同样有效。
function testIObj(obj: IObj): Result {
let results: Result = {};
for (let k in obj) {
results[k] = obj[k].method(obj[k].exp)
}
return results;
}
testIObj(null).key1;
这使您可以做一些好事,例如轻松处理整个列表。
如果方法函数将返回不同的类型,那么扩展以适应它们也相对容易。
type Result = {
// must be optional so we can initialize it with nothing
[P in keyof IObj]?: boolean | number
}
关于javascript - 如何在 typescript 中键入一个动态加载其自己的成员的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41549345/