[Typescript] Represent Generics at the Lowest Level

 

 

There are two solutions to this challenge, both with different ways of representing the generic.

Solution 1:

The first option is using TConfig which extends rawConfig and includes featureFlagshomePage, and any:

export const getHomePageFeatureFlags = <
  TConfig extends {
    rawConfig: {
      featureFlags: {
        homePage: any;
      };
    };
  }
>(
  ...

Hovering over getHomePageFeatureFlags in the tests will show the the entire object is being captured in the generic slot when using TConfig as the type argument.

This means that we can index into TConfig to find the type that the flag should be:

export const getHomePageFeatureFlags = < TConfig extends { rawConfig: { featureFlags: { homePage: any; }; }; } >( config: TConfig, override: ( flags: TConfig["rawConfig"]["featureFlags"]["homePage"] ) => TConfig["rawConfig"]["featureFlags"]["homePage"] ) => { return override(config.rawConfig.featureFlags.homePage); };

As you can see, this approach of capturing the generic on a higher level can be quite messy and captures a lot of unnecessary code.

 

Solution 2:

Using HomePageFlags directly as the generic makes for a more elegant solution since it is the argument for the override function.

We can now drill down to config.rawConfig.featureFlags.homePage inside of the argument:

export const getHomePageFeatureFlags = <HomePageFlags>( config: { rawConfig: { featureFlags: { homePage: HomePageFlags; }; }; }, override: (flags: HomePageFlags) => HomePageFlags ) => { return override(config.rawConfig.featureFlags.homePage); };

With this solution, hovering over getHomePageFeatureFlags in the test will only show us the stuff we care about inside of homePage instead of the entire object.

// hovering over getHomePageFeatureFlags 
const getHomePageFeatureFlags: <{ showBanner: boolean; showLogOut: boolean; }>...

Being able to access only the specific properties we want instead of drilling down twice makes the code much more readable.

A general rule of thumb for working with generics is to always represent them with a low-level type. As seen in the second solution, it's more efficient to drill down to find the specific type argument.

posted @   Zhentiw  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2021-01-14 [Typescript] Extend Functionality of a TypeScript Class with Decorators
2020-01-14 [Algorithm] 14. Longest Common Prefix -- 3
2019-01-14 [Spring boot] Configuring and Accessing a Data Source
2019-01-14 [Spring boot] Integrating with h2 database
2019-01-14 [Spring boot] Application properties and configurations
2019-01-14 [Spring boot] A quick REST API Guide
2019-01-14 [Functional Programming] Combine Multiple State ADT Instances with the Same Input (converge(liftA2(constant)))
点击右上角即可分享
微信分享提示