feat(struct): add constraint to TOmitInitKey

This commit is contained in:
Simon Chan 2021-01-18 11:21:07 +08:00
parent 2cef5baba2
commit 4fb1d07722
4 changed files with 20 additions and 17 deletions

View file

@ -21,7 +21,7 @@ import type { StructValue } from './struct-value';
export abstract class StructFieldDefinition< export abstract class StructFieldDefinition<
TOptions = void, TOptions = void,
TValue = unknown, TValue = unknown,
TOmitInitKey = never, TOmitInitKey extends PropertyKey = never,
> { > {
public readonly options: TOptions; public readonly options: TOptions;

View file

@ -1,6 +1,6 @@
import { StructDefaultOptions, StructDeserializationContext, StructFieldDefinition, StructFieldValue, StructOptions, StructSerializationContext, StructValue } from './basic'; import { StructDefaultOptions, StructDeserializationContext, StructFieldDefinition, StructFieldValue, StructOptions, StructSerializationContext, StructValue } from './basic';
import { ArrayBufferFieldType, ArrayBufferLikeFieldType, FixedLengthArrayBufferLikeFieldDefinition, FixedLengthArrayBufferLikeFieldOptions, NumberFieldDefinition, NumberFieldType, StringFieldType, Uint8ClampedArrayFieldType, VariableLengthArrayBufferLikeFieldDefinition, VariableLengthArrayBufferLikeFieldOptions } from './types'; import { ArrayBufferFieldType, ArrayBufferLikeFieldType, FixedLengthArrayBufferLikeFieldDefinition, FixedLengthArrayBufferLikeFieldOptions, LengthField, NumberFieldDefinition, NumberFieldType, StringFieldType, Uint8ClampedArrayFieldType, VariableLengthArrayBufferLikeFieldDefinition, VariableLengthArrayBufferLikeFieldOptions } from './types';
import { Awaited, Evaluate, Identity, KeysOfType, Overwrite } from './utils'; import { Awaited, Evaluate, Identity, Overwrite } from './utils';
export interface StructLike<TValue> { export interface StructLike<TValue> {
deserialize(context: StructDeserializationContext): Promise<TValue>; deserialize(context: StructDeserializationContext): Promise<TValue>;
@ -19,17 +19,18 @@ export type StructValueType<T extends StructLike<any>> =
*/ */
type AddFieldDescriptor< type AddFieldDescriptor<
TFields extends object, TFields extends object,
TOmitInit extends string, TOmitInitKey extends PropertyKey,
TExtra extends object, TExtra extends object,
TPostDeserialized, TPostDeserialized,
TFieldName extends PropertyKey, TFieldName extends PropertyKey,
TDefinition extends StructFieldDefinition<any, any, any>> = TDefinition extends StructFieldDefinition<any, any, any>
> =
Identity<Struct< Identity<Struct<
// Merge two types // Merge two types
// Evaluate immediately to optimize editor hover tooltip // Evaluate immediately to optimize editor hover tooltip
Evaluate<TFields & Record<TFieldName, TDefinition['valueType']>>, Evaluate<TFields & Record<TFieldName, TDefinition['valueType']>>,
// Merge two `TOmitInit // Merge two `TOmitInitKey`s
TOmitInit | TDefinition['omitInitKeyType'], TOmitInitKey | TDefinition['omitInitKeyType'],
TExtra, TExtra,
TPostDeserialized TPostDeserialized
>>; >>;
@ -39,7 +40,7 @@ type AddFieldDescriptor<
*/ */
interface ArrayBufferLikeFieldCreator< interface ArrayBufferLikeFieldCreator<
TFields extends object, TFields extends object,
TOmitInit extends string, TOmitInitKey extends PropertyKey,
TExtra extends object, TExtra extends object,
TPostDeserialized TPostDeserialized
> { > {
@ -63,7 +64,7 @@ interface ArrayBufferLikeFieldCreator<
typescriptType?: TTypeScriptType, typescriptType?: TTypeScriptType,
): AddFieldDescriptor< ): AddFieldDescriptor<
TFields, TFields,
TOmitInit, TOmitInitKey,
TExtra, TExtra,
TPostDeserialized, TPostDeserialized,
TName, TName,
@ -88,7 +89,7 @@ interface ArrayBufferLikeFieldCreator<
typescriptType?: TTypeScriptType, typescriptType?: TTypeScriptType,
): AddFieldDescriptor< ): AddFieldDescriptor<
TFields, TFields,
TOmitInit, TOmitInitKey,
TExtra, TExtra,
TPostDeserialized, TPostDeserialized,
TName, TName,
@ -104,7 +105,7 @@ interface ArrayBufferLikeFieldCreator<
*/ */
interface ArrayBufferTypeFieldDefinitionCreator< interface ArrayBufferTypeFieldDefinitionCreator<
TFields extends object, TFields extends object,
TOmitInit extends string, TOmitInitKey extends PropertyKey,
TExtra extends object, TExtra extends object,
TPostDeserialized, TPostDeserialized,
TType extends ArrayBufferLikeFieldType TType extends ArrayBufferLikeFieldType
@ -118,7 +119,7 @@ interface ArrayBufferTypeFieldDefinitionCreator<
typescriptType?: TTypeScriptType, typescriptType?: TTypeScriptType,
): AddFieldDescriptor< ): AddFieldDescriptor<
TFields, TFields,
TOmitInit, TOmitInitKey,
TExtra, TExtra,
TPostDeserialized, TPostDeserialized,
TName, TName,
@ -130,7 +131,7 @@ interface ArrayBufferTypeFieldDefinitionCreator<
< <
TName extends PropertyKey, TName extends PropertyKey,
TLengthField extends KeysOfType<TFields, number | string>, TLengthField extends LengthField<TFields>,
TOptions extends VariableLengthArrayBufferLikeFieldOptions<TFields, TLengthField>, TOptions extends VariableLengthArrayBufferLikeFieldOptions<TFields, TLengthField>,
TTypeScriptType = TType['valueType'], TTypeScriptType = TType['valueType'],
>( >(
@ -139,7 +140,7 @@ interface ArrayBufferTypeFieldDefinitionCreator<
typescriptType?: TTypeScriptType, typescriptType?: TTypeScriptType,
): AddFieldDescriptor< ): AddFieldDescriptor<
TFields, TFields,
TOmitInit, TOmitInitKey,
TExtra, TExtra,
TPostDeserialized, TPostDeserialized,
TName, TName,
@ -158,7 +159,7 @@ export type StructDeserializedType<TFields extends object, TExtra extends object
export class Struct< export class Struct<
TFields extends object = {}, TFields extends object = {},
TOmitInitKey extends string = never, TOmitInitKey extends PropertyKey = never,
TExtra extends object = {}, TExtra extends object = {},
TPostDeserialized = undefined, TPostDeserialized = undefined,
> implements StructLike<StructDeserializedType<TFields, TExtra, TPostDeserialized>>{ > implements StructLike<StructDeserializedType<TFields, TExtra, TPostDeserialized>>{

View file

@ -102,7 +102,7 @@ const EmptyArrayBuffer = new ArrayBuffer(0);
export abstract class ArrayBufferLikeFieldDefinition< export abstract class ArrayBufferLikeFieldDefinition<
TType extends ArrayBufferLikeFieldType = ArrayBufferLikeFieldType, TType extends ArrayBufferLikeFieldType = ArrayBufferLikeFieldType,
TOptions = void, TOptions = void,
TOmitInitKey = never, TOmitInitKey extends PropertyKey = never,
> extends StructFieldDefinition< > extends StructFieldDefinition<
TOptions, TOptions,
TType['valueType'], TType['valueType'],

View file

@ -2,9 +2,11 @@ import { StructFieldValue, StructOptions, StructSerializationContext, StructValu
import type { KeysOfType } from '../utils'; import type { KeysOfType } from '../utils';
import { ArrayBufferLikeFieldDefinition, ArrayBufferLikeFieldType, ArrayBufferLikeFieldValue } from './array-buffer'; import { ArrayBufferLikeFieldDefinition, ArrayBufferLikeFieldType, ArrayBufferLikeFieldValue } from './array-buffer';
export type LengthField<TFields> = KeysOfType<TFields, number | string>;
export interface VariableLengthArrayBufferLikeFieldOptions< export interface VariableLengthArrayBufferLikeFieldOptions<
TFields = object, TFields = object,
TLengthField extends KeysOfType<TFields, number | string> = any, TLengthField extends LengthField<TFields> = any,
> { > {
lengthField: TLengthField; lengthField: TLengthField;
} }