【问题标题】:Get field type in Typescript在 Typescript 中获取字段类型
【发布时间】:2016-11-10 17:34:07
【问题描述】:

我在 Typescript 上过课。它有一些字段

field1 : ko.observable<number>();
field2 : ko.observable<string>('');
...

在另一个类的某个函数中,我尝试遍历每个对象字段,对于number 类型的字段,我需要进行一些修改。

如何检测到这一点?


我已经尝试过下一步,但总是输入string,这是合乎逻辑的。 locationModel已满 使用来自 HTML 表单的值,其中输入的类型为 text

 Object.keys(locationModel)
 .forEach(property => {
                if (typeof locationModel[property]() === 'number') { }
                else{ }
            }
        });

【问题讨论】:

    标签: javascript typescript knockout.js typeof


    【解决方案1】:

    如果您想将自动类型转换放入淘汰赛中,您可以为此创建一个扩展器。

    在其最基本的形式中,它可以返回一个writable computed

    • write 上转换传入的值并将转换后的值存储在 observable 中,或者
    • 将传入的值原封不动地存储在可观察对象中,并在读取时将其转换。

    后者的实现可能是这样的——运行下面的 sn-p 并注意类型如何反映在视图模型中:

    ko.extenders.type = function (target, type) {
        var typedValue = ko.pureComputed({
            read: function () {
                var value = target();
                if (typeof value === "undefined" || value === null) {
                    return value;
                } else {
                    return type(value);
                }
            },
            write: target
        });
        typedValue.raw = target;
        return typedValue;
    };
    
    var vm = {
        num: ko.observable().extend({type: Number}),
        str: ko.observable().extend({type: String})
    };
    
    ko.applyBindings(vm);
    
    // init some values
    vm.num(100);
    vm.str(100);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
    
    Num: <input data-bind="value: num"> (raw: <span data-bind="text: num.raw"></span>)<br>
    Str: <input data-bind="value: str"> (raw: <span data-bind="text: str.raw"></span>)<br><br>
    
    <hr>
    View Model:<br>
    <pre data-bind="text: ko.toJSON($root, null, 2)"></pre>

    【讨论】:

      【解决方案2】:

      您的问题是来自表单的输入值总是字符串,您必须正确解析这些值以使它们成为您想要的类型。

      因此,您需要手动设置一些映射,以便将所有输入字符串转换为模型中的适当值。

      【讨论】:

      • 我同意。我不确定是否可以强制 observables 成为某种类型,这不是它的工作原理。但完全可以使用extenders 让剔除值自动转换。
      • @Tomalak 从打字稿的角度来看,将 observables 键入到特定类型在编译时是可以的,即使这些约束在运行时都丢失了,就像 TS 中的大多数打字一样。
      • 没错。也许 OP 错误地认为 TypeScript 会涉及运行时类型转换?
      • @Tomalak,是的,我有时会感到困惑,所以想要一些来自 Typescript 的不真实的东西......
      猜你喜欢
      • 2021-10-12
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 1970-01-01
      • 2021-10-03
      • 2019-03-02
      • 2016-06-03
      相关资源
      最近更新 更多