2016-11-10 158 views
1

我在Typescript中有类。它有一些领域在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{ } 
      } 
     }); 

回答

1

如果你想把自动类型转换为敲除,你可以为它创建一个扩展器。

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

  • 并存储传入的值转换中可观察到的转换后的值,或
  • 存储在传入的值可观察不变并将其转换成读取

后者的实现可以这样的 - 运行下面的代码片段,并注意类型的视图模型如何反映:

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>

0

你的问题是,从表单输入的值总是要为字符串,你必须正确地解析值使它们的类型你要的那个。

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

+1

我同意。无论如何,我不确定是否可以强迫观察者成为某种类型的人,但这不是这种工作方式。但是完全可以使用[extenders](http://knockoutjs.com/documentation/extenders.html)来自动完成knockout转换值。 – Tomalak

+0

@Tomalak从打印脚本的角度来看,即使这些约束在运行时全部丢失,就像大多数在TS中输入一样,将类型化为特定类型的观测值在编译时都是可以的。 – Alex

+0

没错。也许OP错误地认为TypeScript会涉及运行时类型转换? – Tomalak