ser*_*0ne 5 javascript typescript
我有一个JavaScript对象,它动态地允许成员作为访问者属性绑定到对象的实例:
资源
function DynamicObject(obj) {
for (var prop in obj) {
Object.defineProperty(this, prop, {
get: function () { return obj[prop]; },
set: function (value) { obj[prop] = value; },
enumerable: true,
configurable: false
});
}
}
Run Code Online (Sandbox Code Playgroud)
用法
var obj = new DynamicObject({
name: "John Smith",
email: "john.smith@test.net",
id: 1
});
Run Code Online (Sandbox Code Playgroud)
何时obj创建,构造函数参数的成员绑定obj为访问者属性.这些出现在intellisense中
我想知道是否有可能在TypeScript中模拟这种行为(包括智能感知)?
笔记
当你在TypeScript中运行这段代码时,没有智能感知因为一切都是any,所以TypeScript并不真正知道发生了什么.
你不能.这些是完全动态的属性,在运行时添加,因此您无法在编译时知道它们是什么.我也认为你不希望知道他们是早期的东西; 如果你有强制执行的限制,他们应该自己说明(下面的第一个例子).
如果您的代码依赖于一组访问器,您应该将它们直接放在接口或合同中,因为您提前了解了它们并且应该通知它.您可以使用可选属性(将访问器定义为较低)以使其更简单:
interface HasSomeProps {
foo: string;
bar?: string;
}
class DoesTheProps implements HasSomeProps {
set foo(value) {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
如果您有一堆一致(或半一致)访问器,则可以在类型上定义索引器,如:
interface AccessStrings {
[key: string]: string;
}
Run Code Online (Sandbox Code Playgroud)
这不允许您限制键.如果需要,您应该明确列出属性.
我想知道是否可以在 TypeScript 中模拟这种行为(包括智能感知)?
是的。
您可以将通用呼叫签名分配给DynamicObject。您需要将其声明为变量:
var DynamicObject: new <T>(obj: T) => T = function (obj)
{
for (var prop in obj)
{
Object.defineProperty(this, prop, {
get: function () { return obj[prop]; },
set: function (value) { obj[prop] = value; },
enumerable: true,
configurable: false
});
}
} as any;
Run Code Online (Sandbox Code Playgroud)
这样,IntelliSense 会将返回的值视为与new DynamicObject传入的值具有相同的类型。相同的属性名称、相同的属性类型。您将获得完全的自动完成和类型安全。
如果您无法理解第一行中的该部分,则与编写以下内容相同:
// Declare type (only exists during compile-time)
var DynamicObject: new <T>(obj: T) => T;
// Assign value (during runtime)
DynamicObject = function (obj)
{
...
} as any;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
420 次 |
| 最近记录: |