【问题标题】:Validate Input with custom type Angular使用自定义类型 Angular 验证输入
【发布时间】:2017-05-23 11:39:13
【问题描述】:

我有一个将 Input 定义为自定义类型的组件。

@Input() public labelSize: 'small' | 'normal' | 'large'  = 'normal';

但显然我可以将任何类型的参数传递给组件标签。我永远不会有任何错误/警告。

<my-component labelSize="whatever"></my-component>

我可以通过事件传递一个数字

<my-component labelSize=12345></my-component>

我希望 typescript 编译器或 angular 能给我一些关于这种错误的反馈。

我应该验证自己组件的所有输入的类型吗?

有什么最佳做法吗?

谢谢

【问题讨论】:

    标签: angular typescript


    【解决方案1】:

    角度模板是 HTML,并且没有以任何方式连接到 typescript 以检查这一点。即使在打字稿中,也允许绕过类型声明,例如this.labelSize = 'whatever' as any.

    最后代码仍然是javascript。在模板中就像从一开始就使用普通的 javascript。

    如果您真的想提前发现不匹配,一些可能的解决方案是:

    1.验证

    如前所述,进行手动验证或使用验证库来指定约束,例如https://validatejs.org/

    顺便说一句,您还可以使用 Pipe 对您的任何值动态添加验证,并使您的 html 更加清晰。

    2。配置对象

    您可以捕获类型在对象中很重要的组件的配置,例如

    @Input() public config: {
      labelSize: 'small' | 'normal' | 'large';
    } = { labelSize: 'normal' }
    

    然后将输入绑定到myCompConfig:

    <my-component [config]="myCompConfig"></my-component>
    

    然后在你使用它的控制器中

    this.myCompConfig = { labelSize: 'whatever' } // error <- type is enforced now
    

    3.用于模板的 TS

    您可以使用 TS 而不是 HTML 作为模板,并用一些类型信息辅助它:

    先分享你的类型

    export type LabelSize = 'small' | 'normal' | 'large'
    
    @Input() public labelSize: LabelSize = 'normal';
    

    我的模板.ts

    const labelSize: LabelSize = 'whatever' // error <- type is enforced 
    
    export const template = `
        <my-component labelSize=${labelSize}></my-component>`
    `;
    

    然后在你的组件中直接使用它

    import { template } from './my-template.ts';
    @Component({ selector: 'something', template })
    

    请注意,这也可以提取到工厂方法中以创建太阳穴的一部分,例如你可以有一个基于 labelSize 参数创建这个元素的工厂(并且这个参数可以有类型信息)。

    【讨论】:

    • 第一种方法不是一种选择。我的意思是我们使用打字稿基本上是因为类型验证。如果它不能用像角模板这样简单的东西来做到这一点,它就会失去大部分的兴趣。其次,我认为它更容易接受,虽然有点重,但看起来像一个黑客。第三个想法基本上是 React。无论如何感谢这些想法,我会再检查一下。
    • :) 是的,我同意该评估,尽管我不想直接调用第 3 个选项做出反应。我在使用 angular 2 和 typescript 时遇到了同样的问题,也许我遗漏了一些东西,但到目前为止,在 typescript 中,似乎有一些部分缺少类型信息就足够了,它可能会搞砸链条上的其他部分——最后不管你做什么,它只覆盖了应用程序的 x%,所以我一直担心没有被捕获的类型错误;似乎 TS 是一种妥协,而不是一个完整的类型安全系统,实际上它不能完全做到这一点,因为底层的运行时语言仍然是高度动态的
    猜你喜欢
    • 2019-02-18
    • 2018-03-18
    • 1970-01-01
    • 2020-06-14
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    相关资源
    最近更新 更多