Improve TS annotations when calling readObjectField/readStructField

This commit is contained in:
Steve Sanderson 2018-01-29 21:47:55 +00:00
parent c81d537ea3
commit 855d93ce67
4 changed files with 10 additions and 11 deletions

View File

@ -116,8 +116,8 @@ export const monoPlatform: Platform = {
return Module.getValue((baseAddress as any as number) + (fieldOffset || 0), 'i32');
},
readObjectField: function readHeapObject(baseAddress: Pointer, fieldOffset?: number): System_Object {
return Module.getValue((baseAddress as any as number) + (fieldOffset || 0), 'i32') as any as System_Object;
readObjectField: function readHeapObject<T extends System_Object>(baseAddress: Pointer, fieldOffset?: number): T {
return Module.getValue((baseAddress as any as number) + (fieldOffset || 0), 'i32') as any as T;
},
readStringField: function readHeapObject(baseAddress: Pointer, fieldOffset?: number): string | null {
@ -125,8 +125,8 @@ export const monoPlatform: Platform = {
return fieldValue === 0 ? null : monoPlatform.toJavaScriptString(fieldValue as any as System_String);
},
readStructField: function readStructField(baseAddress: Pointer, fieldOffset?: number): Pointer {
return ((baseAddress as any as number) + (fieldOffset || 0)) as any as Pointer;
readStructField: function readStructField<T extends Pointer>(baseAddress: Pointer, fieldOffset?: number): T {
return ((baseAddress as any as number) + (fieldOffset || 0)) as any as T;
},
};

View File

@ -13,9 +13,9 @@
getObjectFieldsBaseAddress(referenceTypedObject: System_Object): Pointer;
readInt32Field(baseAddress: Pointer, fieldOffset?: number): number;
readObjectField(baseAddress: Pointer, fieldOffset?: number): System_Object;
readObjectField<T extends System_Object>(baseAddress: Pointer, fieldOffset?: number): T;
readStringField(baseAddress: Pointer, fieldOffset?: number): string | null;
readStructField(baseAddress: Pointer, fieldOffset?: number): Pointer;
readStructField<T extends Pointer>(baseAddress: Pointer, fieldOffset?: number): T;
}
// We don't actually instantiate any of these at runtime. For perf it's preferable to

View File

@ -4,20 +4,20 @@ import { platform } from '../Environment';
// Keep in sync with the structs in .NET code
export const renderBatch = {
updatedComponents: (obj: RenderBatchPointer) => platform.readStructField(obj, 0) as ArrayRangePointer,
updatedComponents: (obj: RenderBatchPointer) => platform.readStructField<ArrayRangePointer>(obj, 0),
};
const arrayRangeStructLength = 8;
export const arrayRange = {
array: (obj: ArrayRangePointer) => platform.readObjectField(obj, 0) as System_Array,
array: (obj: ArrayRangePointer) => platform.readObjectField<System_Array>(obj, 0),
count: (obj: ArrayRangePointer) => platform.readInt32Field(obj, 4),
};
export const renderTreeDiffStructLength = 4 + 2 * arrayRangeStructLength;
export const renderTreeDiff = {
componentId: (obj: RenderTreeDiffPointer) => platform.readInt32Field(obj, 0),
edits: (obj: RenderTreeDiffPointer) => platform.readStructField(obj, 4) as ArrayRangePointer,
currentState: (obj: RenderTreeDiffPointer) => platform.readStructField(obj, 4 + arrayRangeStructLength) as ArrayRangePointer,
edits: (obj: RenderTreeDiffPointer) => platform.readStructField<ArrayRangePointer>(obj, 4),
currentState: (obj: RenderTreeDiffPointer) => platform.readStructField<ArrayRangePointer>(obj, 4 + arrayRangeStructLength),
};
// Nominal types to ensure only valid pointers are passed to the functions above.

View File

@ -19,7 +19,6 @@ export const renderTreeNode = {
attributeName: (node: RenderTreeNodePointer) => platform.readStringField(node, 20),
attributeValue: (node: RenderTreeNodePointer) => platform.readStringField(node, 24),
componentId: (node: RenderTreeNodePointer) => platform.readInt32Field(node, 32),
component: (node: RenderTreeNodePointer) => platform.readObjectField(node, 36),
};
export enum NodeType {