Comments (7)
Thanks, I never used it honstly. Was just a quick prototype.
In our extensions we still depend on the non-public types. This feature would improve the situation, but only if it lands in the core (also depends on internal types).
from platform.
@rainerhahnekamp I had a need for this in an app, and I gave it a go at trying to implement it, I got it working, and then just noticed you had a version in stackblitz, my version has a few improvements like it keeps the wrapped feature input type in case you need it as well
import { SignalStoreFeature } from '@ngrx/signals';
import type {
SignalStoreFeatureResult,
SignalStoreSlices,
} from '@ngrx/signals/src/signal-store-models';
import type { StateSignal } from '@ngrx/signals/src/state-signal';
import { Prettify } from '@ngrx/signals/src/ts-helpers';
export function withFeatureFactory<
Input extends SignalStoreFeatureResult,
Feature extends SignalStoreFeature<any, any>,
>(
featureFactory: (
store: Prettify<
SignalStoreSlices<Input['state']> &
Input['signals'] &
Input['methods'] &
StateSignal<Prettify<Input['state']>>
>,
) => Feature,
): SignalStoreFeature<
Input & (Feature extends SignalStoreFeature<infer In, any> ? In : never),
Feature extends SignalStoreFeature<any, infer Out> ? Out : never
> {
return ((store: any) => {
const { slices, methods, signals, hooks, ...rest } = store;
return featureFactory({
...slices,
...signals,
...methods,
...rest,
} as Prettify<
SignalStoreSlices<Input['state']> &
Input['signals'] &
Input['methods'] &
StateSignal<Prettify<Input['state']>>
>)(store);
}) as Feature;
}
from platform.
That's a good point. I also use non-public types in a few places, but this is mainly because I need to allow methods to use things from the store. If this were part of the core, it would reduce the need to expose those non-public types.
from platform.
Having thought on this more, maybe this could be an overload of the signalStoreFeature like
signalStore(
withMethods(() => {
const httpClient = inject(HttpClient);
return {
load() {
return httpClient.get<Person[]>('someUrl');
},
};
}),
signalStoreFeature((store) => withEntityVersioner(() => store.load())),
);
from platform.
I would love to write:
signalStore(
withMethods(() => {
const httpClient = inject(HttpClient);
return {
load() {
return httpClient.get<Person[]>('someUrl');
},
};
}),
withEntityVersioner((store) => store.load()),
);
But as I asked in #4272, it requires to expose more types to the public API.
from platform.
@gabrielguerrero, I think - and please correct me if I'm wrong - we are talking here about two different features.
- You need more feature functions and want to fix that by using
signalStoreFeature
because that's the closest thing at hand. So your usage ofsignalStoreFeature
is bound to a specificsignalStore
.
flowchart LR
signalStoreFeature --> Service --> signalStore
- I was speaking of providing a generic
signalStoreFeature
which needs to get features of an existingsignalStore
by not depending on it.
flowchart LR
ServiceImplementation --> signalStore
withFeatureFactory --> GenericService
withFeatureFactory --> ServiceImplementation
signalStoreFeature --> GenericService
I'd we need both but maybe not under the same name.
from platform.
Related Issues (20)
- Allow generics in ngrx signals withEntites HOT 2
- How do you add a Pipe provider to a SignalStore, and SignalStore provider to a Service?
- NgRx Signal Store: functions inside OnInit hook, don't run when store is injected into normal service HOT 1
- Adding new withMethods causes NgRx signal store to return store: {[p:string]: function():?) HOT 4
- Do 'createSelector' can access to the previous value of the state inside the function ?
- PSA: Angular v18 and NgRx v18 HOT 10
- NGRX Signals Needs support for Angular 18 HOT 1
- Remove effects/concatLatestFrom docs HOT 4
- Remove component-store/tapResponse docs
- ngrx.io dns is down HOT 3
- ngrx.io server is down HOT 1
- Add support for ESLint v9
- computed not re-calculating if signal is inside function HOT 1
- [Bug] @ngrx/signals: DeepSignal is not exported HOT 3
- UpdateStr and UpdateNum are not export in index HOT 2
- Document ESLint v9 support
- Add v18 migration guide
- Add eslint rule for signalState and withState
- [18.0.0-rc.0] Failed to load config "plugin:@ngrx/recommended-requiring-type-checking" HOT 8
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from platform.