DEV Community

official_dulin
official_dulin

Posted on

Pick and large interface V.S. small interface. Which one is better?

When I use the option 1 to make my business types(T0, T1, etc...), I found I repeated Pick<ChannelBaseInfo1, 'channelCode'> too many. So maybe option 2 is better? Please give me some suggestion. Thanks.

// Option 1. 
type ChannelBaseInfo1 = {
  channelCode: string;
  channelName: string;
}

// Use Pick utility type
type T0 = Pick<ChannelBaseInfo1, 'channelCode'> & {
  t0: string;
}

type T1 = ChannelBaseInfo1 & {
  t50: string;
}

type T2 = Partial<Pick<ChannelBaseInfo1, 'channelCode'>> & {
  t2: any;
}

// a lots of types using ChannelBaseInfo1 or Pick<ChannelBaseInfo1, 'channelCode'>
// ...
type T100 = Pick<ChannelBaseInfo1, 'channelName'> & {
  t100: string;
}

// Option 2.
type ChannelCode = {
  channelCode: string;
}
type ChannelName = {
  channelName: string;
}
type ChannelBaseInfo2 = ChannelCode & ChannelName;

type T101 = ChannelCode & {
  t101: string;
}

type T102 = ChannelBaseInfo2 & {
  t102: string;
}
type T103 = Partial<ChannelCode> & {
  t103: string;
}
// a lots of types using ChannelBaseInfo2, ChannelCode and ChannelName
// ...
type T200 = ChannelName & {
  t200: string;
}
Enter fullscreen mode Exit fullscreen mode

TypeScript Playground

Top comments (2)

Collapse
 
bias profile image
Tobias Nickel

small interfaces.
and the ChallelBaseInfo should be named ChannelInfo and the properties should be named code and number, otherwise you create a lot of stutter. it might help if you try reading your code out loud 😉

Collapse
 
mrdulin profile image
official_dulin • Edited

Yeah. I understand I don't need to add channel prefix to each property like channelXXX pattern because we already have the ChannelInfo context. That's not the point. This is just a demo.

Small interfaces like this:

type ChannelCode = {
   code: string;
}
type ChannelName = {
   name: string;
}
type ChannelInfo = ChannelCode & ChannelName;
Enter fullscreen mode Exit fullscreen mode

Actually, this will raise another question. How to name the types. If the code property is a union type rather than string. How should we name the ChannelCode object type?

type ChannelCode = '0' | '1' | '2';
type ChannelCodeDTO = {
   code: ChannelCode;
};
Enter fullscreen mode Exit fullscreen mode

In order to distinct the ChannelCode union type and object type names, I add a suffix like DTO. There are some choices:

ChannelCodeObject  
ChannelCodeStruct 
ChannelCodeDTO
Enter fullscreen mode Exit fullscreen mode

Or,

type ChannelCode = {
   code: '0' | '1' | '2';
};
// later
type Biz = {
  channelCode: ChannelCode['code'];
}
Enter fullscreen mode Exit fullscreen mode

How will you handle this situation?