diff --git a/src/computed.ts b/src/computed.ts index 6d99595..555896a 100644 --- a/src/computed.ts +++ b/src/computed.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {defaultEquals, ValueEqualityFn} from './equality.js'; +import {defaultEquals, ValueEqualityComparer} from './equality.js'; import { consumerAfterComputation, consumerBeforeComputation, @@ -22,7 +22,7 @@ import { * * `Computed`s are both producers and consumers of reactivity. */ -export interface ComputedNode extends ReactiveNode { +export interface ComputedNode extends ReactiveNode, ValueEqualityComparer { /** * Current value of the computation, or one of the sentinel values above (`UNSET`, `COMPUTING`, * `ERROR`). @@ -39,8 +39,6 @@ export interface ComputedNode extends ReactiveNode { * The computation function which will produce a new value. */ computation: () => T; - - equal: ValueEqualityFn; } export type ComputedGetter = (() => T) & { diff --git a/src/equality.ts b/src/equality.ts index 20f9b9f..5014620 100644 --- a/src/equality.ts +++ b/src/equality.ts @@ -7,9 +7,13 @@ */ /** - * A comparison function which can determine if two values are equal. + * An interface representing a comparison strategy to determine if two values are equal. + * + * @template T The type of the values to be compared. */ -export type ValueEqualityFn = (a: T, b: T) => boolean; +export interface ValueEqualityComparer { + equal(a: T, b: T): boolean; +} /** * The default equality function used for `signal` and `computed`, which uses referential equality. diff --git a/src/public-api-types.ts b/src/public-api-types.ts index 274f06b..762a8f6 100644 --- a/src/public-api-types.ts +++ b/src/public-api-types.ts @@ -93,3 +93,19 @@ expectTypeOf().toEqualTypeOf< expectTypeOf(new Signal.State(0)).toEqualTypeOf>(); expectTypeOf(new Signal.State(0).get()).toEqualTypeOf(); expectTypeOf(new Signal.State(0).set(1)).toEqualTypeOf(); + +/** + * Assigning subtypes works + */ +expectTypeOf>().toMatchTypeOf>(); +expectTypeOf>().toMatchTypeOf>(); + +/** + * Test data types + */ +interface Broader { + strProp: string; +} +interface Narrower extends Broader { + numProp: number; +} diff --git a/src/signal.ts b/src/signal.ts index 7348c22..6d5b692 100644 --- a/src/signal.ts +++ b/src/signal.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {defaultEquals, ValueEqualityFn} from './equality.js'; +import {defaultEquals, ValueEqualityComparer} from './equality.js'; import {throwInvalidWriteToSignalError} from './errors.js'; import { producerAccessed, @@ -30,9 +30,8 @@ declare const ngDevMode: boolean | undefined; */ let postSignalSetFn: (() => void) | null = null; -export interface SignalNode extends ReactiveNode { +export interface SignalNode extends ReactiveNode, ValueEqualityComparer { value: T; - equal: ValueEqualityFn; } export type SignalBaseGetter = (() => T) & {readonly [SIGNAL]: unknown};