- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
有什么方法可以将索引属性委托(delegate)给 typescript 中的成员吗?我正在编写一个包装器,我想将索引属性委托(delegate)给我正在包装的对象。
类似于:
interface MyStringArray {
length : number;
clear() : void;
[index: number] : string;
}
export class MyStringArrayWrapper implements MyStringArray {
private wrapped : MyStringArray;
public get length() : number {
return this.wrapped.length;
}
public clear() : void {
this.wrapped.clear();
}
// This doesn't work
public get [index : number] : string {
return this.wrapped[index];
}
// This doesn't work either
public set [index : number](value: string) {
this.wrapped[index] = value;
}
}
最佳答案
TypeScript 不允许这样做,因为它无法为这样的构造生成 JavaScript 代码。在 JavaScript 中无法在设置任何属性时调用的类上定义一个包罗万象的 getter/setter。
我能得到的最接近的方法是在类上定义hasItem
、getItem
和setItem
方法,然后包装每个实例 类在 ES2015 Proxy
对象中的原型(prototype),该对象代理所有 get
和 set
s 到该实例的属性。
function isArrayIndex(key) {
var keyAsNumber = +key; // convert string to number
if (keyAsNumber < 0) {
return false; // must be positive or zero
}
if (keyAsNumber !== keyAsNumber|0) {
return false; // must be integer
}
return true;
}
function toArrayIndex(key) {
return key|0; // convert string to integer
}
function MyArrayWrapper(wrapped) {
this.wrapped = wrapped;
}
MyArrayWrapper.prototype = {
get length() {
return this.wrapped.length;
},
clear() {
this.wrapped.length = 0;
},
getItem(index) {
return this.wrapped[index];
},
setItem(index, value) {
this.wrapped[index] = value;
}
}
var MyArrayWrapperProxyHandler = {
get: function (target, key, receiver) {
if (isArrayIndex(key)) {
return receiver.getItem(toArrayIndex(key));
} else {
return Reflect.get(target, key, receiver);
}
},
set: function (target, key, value, receiver) {
if (isArrayIndex(key)) {
return receiver.setItem(toArrayIndex(key), value);
} else {
return Reflect.set(target, key, value, receiver);
}
}
};
MyArrayWrapper.prototype = new Proxy(MyArrayWrapper.prototype, MyArrayWrapperProxyHandler);
var array = ['a', 'b', 'c'];
var wrapper = new MyArrayWrapper(array);
console.log('read:', wrapper[2] === 'c'); // true, reads from wrapped array
wrapper[3] = 'd';
console.log('write:', array[3] === 'd'); // true, writes to wrapped array
console.log('resize:', wrapper.length === 4); // true, wrapped array is resized
这需要支持 Proxy 对象的现代浏览器,并且它使用 Reflect
通过原型(prototype)链手动传递其他属性(例如 this.wrapped
)。有很多东西不起作用(例如 '2' in wrapped
是 false
),因为我没有找到正确捕获它们的方法。
此外,代理比直接使用 hasItem/getItem/setItem
慢得多,因此我不建议将它们用于任何对性能至关重要的事情。它们的使用也可能非常困惑,因为当涉及代理时,一个简单的 foo[0] = 'bar'
突然可以做各种疯狂的事情。
如果您对以上所有内容都满意,那么当然可以,将一些类型添加到上面的代码片段中,您将拥有带有委托(delegate)数组索引 getter/setter 的 TypeScript 代码。这实际上更像是一个“概念证明”,我只是想看看你能把 JavaScript 推到什么程度。 :-P
关于typescript - 有没有办法在 typescript 中委托(delegate)索引属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38925391/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!