mirror of
https://github.com/yume-chan/ya-webadb.git
synced 2025-10-05 10:49:24 +02:00
feat(struct): add constraint to TOmitInitKey
This commit is contained in:
parent
2cef5baba2
commit
4fb1d07722
4 changed files with 20 additions and 17 deletions
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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>>{
|
||||||
|
|
|
@ -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'],
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue