在Typescript中获取字段类型
问题描述:
我在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{ }
}
});
答
如果你想把自动类型转换为敲除,你可以为它创建一个扩展器。
在其最基本的形式,它可以返回一个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>
答
你的问题是,从表单输入的值总是要为字符串,你必须正确地解析值使它们的类型你要的那个。
因此,您需要手动设置一些映射,以便将所有输入字符串转换为模型中的相应值。
我同意。无论如何,我不确定是否可以强迫观察者成为某种类型的人,但这不是这种工作方式。但是完全可以使用[extenders](http://knockoutjs.com/documentation/extenders.html)来自动完成knockout转换值。 – Tomalak
@Tomalak从打印脚本的角度来看,即使这些约束在运行时全部丢失,就像大多数在TS中输入一样,将类型化为特定类型的观测值在编译时都是可以的。 – Alex
没错。也许OP错误地认为TypeScript会涉及运行时类型转换? – Tomalak