在Typescript中获取字段类型

时间:2016-11-10 17:34:07

标签: javascript typescript knockout.js typeof

我在打字稿中上课。它有一些字段

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

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

我怎样才能发现这个?

我接下来尝试了,但总是输入string这是逻辑上的。 locationModel已填满  使用HTML表单中的值,其中输入的类型为text

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

2 个答案:

答案 0 :(得分:1)

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

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

  • 转换 write 上的传入值,并将转换后的值存储在observable中,或
  • 将传入的值存储在observable中,并将其转换为 read

后者的实现可能是这样的 - 运行下面的代码片段并注意该类型在viewmodel中的反映方式:

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>

答案 1 :(得分:0)

您的问题是表单中的输入值始终是字符串,您必须正确解析值以使其成为您想要的类型。

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