Javascript 如何使JS对象*成为*TypeScript类实例

Javascript 如何使JS对象*成为*TypeScript类实例,javascript,typescript,Javascript,Typescript,假设我有以下课程: export class MyClass { str: string = ''; foo() { console.log(this.str); } } 然后,在其他一些代码中: var myObj = { str: 'Hello World'; } 如何将myObj转换为MyClass实例,这样下面的行就可以工作了: myObj.foo(); // writes 'Hello World' to the console

假设我有以下课程:

export class MyClass {
    str: string = '';

    foo() {
        console.log(this.str);
    }
}
然后,在其他一些代码中:

var myObj = {
    str: 'Hello World';
}
如何将
myObj
转换为
MyClass
实例,这样下面的行就可以工作了:

myObj.foo();
// writes 'Hello World' to the console
(请注意,我无法更改myObj的创建,因为它是在另一个库中创建的)

*****编辑:***** 我还在寻找解决办法。主要问题是
MyClass
引用了其他类,这些类可能引用了
MyClass
。这是一个完整的对象图,我正试图将其转换为TypeScript类


对于每个类和每个属性,我都知道它的类型,并且它与
MyClass

上定义的类和属性完全匹配。我找到了它,现在使用以下实用方法:

export class Util {
    static become(obj: any, newClass: any) {
        obj.__proto__ = (<any>(new newClass())).__proto__;
    }
}
也许还有另一种更优雅的方式,不需要使用
\uuuu proto\uuuu
也许是这样的:(我将MyClass添加为JS代码)


我认为最简单的解决方案、可读性最高的解决方案和代码行数最少的解决方案就是映射它:

var myClass = new MyClass();
myClass.str = myObj.str;

myClass.foo(); 
如果
str
属性是必需的,则可以将其设置为构造函数参数,并将其减少一行

var myClass = new MyClass(myObj.str);

myClass.foo();
更新 如果程序中有许多具有相同属性的类,也许可以将这些属性封装在一个类中。例如,如果所有类都有属性
name、昵称、avatar
,则可以将它们包装到
概要文件
类中。如果需要从一个类中获取概要文件并将其添加到另一个类中,这将为您提供一个要映射的属性


但是,您最了解您的用例,因此您可能会对这个J感兴趣,如果所有属性都具有相同的名称,它应该可以轻松映射您的内容:

创建对象的另一个库是否总是从函数返回该对象?您可以创建一个.d.ts定义文件,该文件定义特定函数返回MyClass。

既然您说有许多对象具有未知的属性列表,我想您不能为MyClass编写构造函数来接收任意对象并从其属性创建MyClass实例。因此,您不能有意义地将myObj“转换”为MyClass的实例

摆弄myObj的原型不是一件很好的事情。请参阅上的警告


这样就可以使用duck类型:
MyClass.foo.call(myObj)只有当MyClass的方法仅引用myObj上可用的属性时,这才有效,即,您不希望MyClass的构造函数将任何其他属性设置为默认值等(因为在这种情况下,MyClass构造函数实际上从未运行过)。

如果在构造函数中碰巧有其他类的代码,它不会启动,这使得此解决方案不一定在所有情况下都是可移植的。您可能需要考虑将数据复制到一个新实例中。这样,构造函数和属性设置器就有机会执行。您不应该摆弄
\uuuuu proto\uuuu
。它在ES5及以下版本中是非标准的,甚至在ES6中也不鼓励自己设置它。我正在寻找一种不创建新对象的通用方法。我有许多要转换的对象的引用,它们比只使用一个属性要复杂得多。
str
。属性名称总是匹配吗?是的,属性名称总是匹配。但是在这种情况下,
MyClass
构造函数不会被执行,是吗?因此,在使用
\uuuuu proto\uuuuu
时也存在同样的问题。
var myClass = new MyClass();
myClass.str = myObj.str;

myClass.foo(); 
var myClass = new MyClass(myObj.str);

myClass.foo();