Javascript 将文字对象设置为组件';s输入属性作为已知对象类

Javascript 将文字对象设置为组件';s输入属性作为已知对象类,javascript,angular,Javascript,Angular,我有一个@Input属性类型为Foo的组件: @组件({ ... }) 导出类MyComponent{ @输入()选项:Foo; ... } 并在ParentComponent.htmlliteral类中作为输入值传递给它: 然后选项的类型不再是Foo。它将更改为匿名对象,因此无法再访问Foo的方法。 防止这种情况的一种方法是在ParentComponent.ts中创建Foo的实例,并将其作为变量传递: @组件({ ... }) 导出类ParentComponent{ 选项:新Foo(真、

我有一个
@Input
属性类型为
Foo
的组件:

@组件({
...
})
导出类MyComponent{
@输入()选项:Foo;
...
}
并在
ParentComponent.html
literal类中作为输入值传递给它:


然后
选项的类型不再是
Foo
。它将更改为匿名对象,因此无法再访问
Foo
的方法。
防止这种情况的一种方法是在
ParentComponent.ts
中创建
Foo
的实例,并将其作为变量传递:

@组件({
...
})
导出类ParentComponent{
选项:新Foo(真、真、1、…);
...
}
并在
ParentComponent.html
中使用:


另一种方法是以某种方式将匿名对象强制转换为新创建的
Foo
对象:

@组件({
...
})
导出类MyComponent{
@Input()设置选项(值:Foo){
//不知怎的把匿名演员投给了福。
}
私人选择:Foo;
...
}
  • 有没有更好的或内置的方法来做到这一点
  • 如果没有,那么如何将匿名对象强制转换为
    Foo

  • 如果要使用所描述的两种方法中的一种来使用类方法,您需要在某个时候使用
    new
    创建类
    Foo
    的实例。如果要将普通对象作为
    @Input
    传入,则输入不能是(class-)类型
    Foo
    ,因为它不是该类的实例。在类中,您需要调用
    newfoo(fooint)
    ,然后调用e。G将新创建的实例分配给另一个成员变量

    在我看来,最好将数据放在普通数据对象中而不是类中:为了类型安全,将
    Foo
    定义为
    接口
    而不是
    。然后,将
    中的方法放入一个
    FooService
    ,该服务操作
    Foo
    对象。这样,您就不必为类实例化而烦恼了

    例子 变成:

    interface User {
      firstName: string;
      lastName: string;
    }
    
    class UserService {
      getFullName(user: User): string {
        return `${user.firstName} ${user.lastName}`;
      }
    }
    

    您能将您的场景添加到吗?您所说的“它更改为匿名对象”是什么意思?它一点也不改变,您在没有方法的情况下创建了该对象。您不能在中创建
    new
    某个对象,因此如果您需要它作为类的实例,那么上面显示的第二种方法,即在父组件类中创建它,是正确的方法(除了它应该是
    options=new Foo(…);
    )。一个用于
    接口
    解决方案的简单片段就很好了。我添加了一个简单的示例。这对你有帮助吗?是的<代码>用户服务
    就像用户界面上的包装器一样工作。坦克。
    interface User {
      firstName: string;
      lastName: string;
    }
    
    class UserService {
      getFullName(user: User): string {
        return `${user.firstName} ${user.lastName}`;
      }
    }