Skip to content

Commit 3703e39

Browse files
perf(types): improve typescript performance by using interfaces for declaration merging instead of types
1 parent a48a979 commit 3703e39

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+166
-177
lines changed

lib/input/label/Label2.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
import { Label } from "~ui/input/label/Label"
22
import { LabelAsterix } from "~ui/input/label/LabelAsterix"
3-
import type { HasChildren } from "~ui/utils/HasChildren"
3+
import type { MayHaveChildren } from "~ui/utils/MayHaveChildren"
44
import { classMerge } from "~ui/utils/classMerge"
55

6-
export type Label2Props = {
6+
export interface Label2Props extends MayHaveChildren {
77
title: string
88
subtitle?: string
99
required?: boolean
1010
labelClass?: string
1111
disabled?: boolean
1212
id?: string
13-
} & HasChildren
13+
}
1414

15-
export type Label2PropsFor = Label2Props & {
15+
export interface Label2PropsFor extends Label2Props {
1616
forId: string
1717
}
1818

lib/input/radio/RadioSwitch.tsx

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,20 @@ import { ct0 } from "~ui/i18n/ct0"
33
import { t4multiselect } from "~ui/input/select/t4multiselect"
44
import { classArr } from "~ui/utils/classArr"
55
import type { SignalObject } from "~ui/utils/createSignalObject"
6-
import type { HasChildren } from "~ui/utils/HasChildren"
7-
import type { HasClass } from "~ui/utils/HasClass"
8-
import { type HasDisabled, isDisabled } from "~ui/utils/HasDisabled"
96
import type { HasGetOptions } from "~ui/utils/HasGetOptions"
7+
import type { MayHaveChildren } from "~ui/utils/MayHaveChildren"
8+
import type { MayHaveClass } from "~ui/utils/MayHaveClass"
9+
import { type MayHaveDisabledAccessor, isDisabled } from "~ui/utils/MayHaveDisabledAccessor"
1010
import type { SelectionItem } from "~ui/utils/SelectionItem"
1111
import type { ValueOrAccessor } from "~ui/utils/ValueOrAccessor"
1212

1313
/**
1414
* https://github.com/radix-ui/primitives/blob/main/packages/react/radio-group/src/Radio.tsx
1515
*/
16-
export type RadioSwitchProps = {
16+
export interface RadioSwitchProps extends MayHaveClass, MayHaveChildren, RadioSwitchStateProps, HasGetOptions, MayHaveDisabledAccessor {
1717
id?: string
1818
disabled?: ValueOrAccessor<boolean>
19-
} & HasClass &
20-
HasChildren &
21-
RadioSwitchStateProps &
22-
HasGetOptions &
23-
HasDisabled
19+
}
2420

2521
type RadioSwitchStateProps = {
2622
valueSignal: SignalObject<SelectionItem | null>
@@ -48,11 +44,16 @@ export function RadioSwitch(p: RadioSwitchProps) {
4844
)
4945
}
5046

51-
function NoItems(p: HasClass) {
47+
function NoItems(p: MayHaveClass) {
5248
return <div class={p.class}>{ct0(t4multiselect.No_entries)}</div>
5349
}
5450

55-
function Option(p: { item: SelectionItem; filled: boolean } & RadioSwitchStateProps & HasDisabled & HasClass) {
51+
interface Option2Props extends RadioSwitchStateProps, MayHaveDisabledAccessor, MayHaveClass {
52+
item: SelectionItem
53+
filled: boolean
54+
}
55+
56+
function Option(p: Option2Props) {
5657
// console.log("Option", p.item.value, "value:", p.valueSignal.get())
5758
return (
5859
<button
@@ -88,9 +89,9 @@ function optionToggle(p: OptionProps) {
8889
p.valueSignal.set(p.item)
8990
}
9091

91-
type OptionProps = {
92+
export interface OptionProps extends RadioSwitchStateProps {
9293
item: SelectionItem
93-
} & RadioSwitchStateProps
94+
}
9495

9596
function isChecked(p: OptionProps) {
9697
return p.item.value === p.valueSignal.get()?.value

lib/input/select/Multiselect.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@ import { CorvuPopover, type CorvuPopoverProps } from "~ui/interactive/popover/Co
99
import { classArr } from "~ui/utils/classArr"
1010
import { classMerge } from "~ui/utils/classMerge"
1111
import type { SignalObject } from "~ui/utils/createSignalObject"
12-
import type { HasChildren } from "~ui/utils/HasChildren"
13-
import type { HasClass } from "~ui/utils/HasClass"
1412
import type { HasGetOptions } from "~ui/utils/HasGetOptions"
13+
import type { MayHaveChildren } from "~ui/utils/MayHaveChildren"
14+
import type { MayHaveClass } from "~ui/utils/MayHaveClass"
1515
import type { SelectionItem } from "~ui/utils/SelectionItem"
1616

1717
/**
1818
* https://github.com/radix-ui/primitives/blob/main/packages/react/checkbox/src/Checkbox.tsx
1919
*/
20-
export interface MultiselectProps<T extends string = string> extends MultiselectState<T>, HasClass, HasChildren {
20+
export interface MultiselectProps<T extends string = string> extends MultiselectState<T>, MayHaveClass, MayHaveChildren {
2121
buttonProps: CorvuPopoverProps
2222
textNoEntries?: string
2323
textAddEntry?: string
@@ -148,7 +148,7 @@ function optionIsSelected<T extends string = string>(p: MultiselectOptionState<T
148148
return p.valueSignal.get().some((v) => v.value === p.option.value)
149149
}
150150

151-
function NoItems(p: HasClass) {
151+
function NoItems(p: MayHaveClass) {
152152
return (
153153
<div
154154
class={classMerge(

lib/input/select/NativeSingleSelect.tsx

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,19 @@ import { Key } from "@solid-primitives/keyed"
22
import type { Accessor } from "solid-js"
33
import { ct0 } from "~ui/i18n/ct0"
44
import { t4multiselect } from "~ui/input/select/t4multiselect"
5-
import type { HasChildren } from "~ui/utils/HasChildren"
6-
import type { HasClass } from "~ui/utils/HasClass"
5+
import type { MayHaveChildren } from "~ui/utils/MayHaveChildren"
76
import type { MayHaveClass } from "~ui/utils/MayHaveClass"
87
import { classArr } from "~ui/utils/classArr"
98
import type { SignalObject } from "~ui/utils/createSignalObject"
109

1110
export type ValueDisplayFn = (value: string) => string
1211

13-
export type NativeSingleSelectProps = {
12+
export interface NativeSingleSelectProps extends MayHaveClass, MayHaveChildren {
1413
valueSignal: SignalObject<string>
1514
getOptions: Accessor<string[]>
1615
valueDisplay?: ValueDisplayFn
1716
id?: string
18-
} & HasClass &
19-
HasChildren
17+
}
2018

2119
export function NativeSingleSelect(p: NativeSingleSelectProps) {
2220
return (
@@ -51,7 +49,7 @@ function onChange(
5149
p.valueSignal.set(e.currentTarget.value)
5250
}
5351

54-
function NoItems(p: HasClass) {
52+
function NoItems(p: MayHaveClass) {
5553
return <div class={p.class}>{ct0(t4multiselect.No_entries)}</div>
5654
}
5755

lib/input/textarea/TextareaS.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ import { type ComponentProps, splitProps } from "solid-js"
22
import { Textarea } from "~ui/input/textarea/Textarea"
33
import type { SignalObject } from "~ui/utils/createSignalObject"
44

5-
export type TextAreaSProps = {
5+
export interface TextAreaSProps extends ComponentProps<"textarea"> {
66
valueSignal: SignalObject<string>
77
}
88

9-
export function TextareaS(p: TextAreaSProps & ComponentProps<"textarea">) {
9+
export function TextareaS(p: TextAreaSProps) {
1010
const [, rest] = splitProps(p, ["valueSignal"])
1111
// return <Checkbox value={p.valueSignal.get()} onChange={p.valueSignal.set} {...rest} />
1212
return <Textarea value={p.valueSignal.get()} onInput={(e) => p.valueSignal.set(e.currentTarget.value)} {...rest} />

lib/interactive/button/ButtonIcon1.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ import { buttonIconCva } from "~ui/interactive/button/buttonIconCva"
44
import { classesButtonClickAnimation } from "~ui/interactive/button/classesButtonClickAnimation"
55
import { classesButtonDisabled } from "~ui/interactive/button/classesButtonDisabled"
66
import { Icon1 } from "~ui/static/icon/Icon1"
7-
import type { HasChildren } from "~ui/utils/HasChildren"
8-
import type { HasClass } from "~ui/utils/HasClass"
7+
import type { MayHaveChildren } from "~ui/utils/MayHaveChildren"
8+
import type { MayHaveClass } from "~ui/utils/MayHaveClass"
99

10-
export interface ButtonIcon1Props extends ComponentProps<"button">, ButtonCvaProps, HasClass, HasChildren {
10+
export interface ButtonIcon1Props extends ComponentProps<"button">, ButtonCvaProps, MayHaveClass, MayHaveChildren {
1111
// icon
1212
icon?: string
1313
iconRight?: string

lib/interactive/button/ButtonIconOnly.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ import { buttonIconCva } from "~ui/interactive/button/buttonIconCva"
44
import { classesButtonClickAnimation } from "~ui/interactive/button/classesButtonClickAnimation"
55
import { classesButtonDisabled } from "~ui/interactive/button/classesButtonDisabled"
66
import { Icon0 } from "~ui/static/icon/Icon0"
7-
import type { HasChildren } from "~ui/utils/HasChildren"
8-
import { isDisabled } from "~ui/utils/HasDisabled"
9-
import { type HasIsLoading, isLoading } from "~ui/utils/HasIsLoading"
7+
import type { MayHaveChildren } from "~ui/utils/MayHaveChildren"
8+
import { isDisabled } from "~ui/utils/MayHaveDisabledAccessor"
9+
import { isLoading, type MayHaveIsLoading } from "~ui/utils/MayHaveIsLoading"
1010

11-
export interface ButtonIconOnlyProps extends ComponentProps<"button">, ButtonCvaProps, HasIsLoading, HasChildren {
11+
export interface ButtonIconOnlyProps extends ComponentProps<"button">, ButtonCvaProps, MayHaveIsLoading, MayHaveChildren {
1212
title: string
1313
icon: string
1414
iconRight?: boolean

lib/interactive/check/Checkbox.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import { mdiCheckboxMarked, mdiSquareOutline } from "@mdi/js"
22
import { splitProps, type ComponentProps } from "solid-js"
33
import { Icon1 } from "~ui/static/icon/Icon1"
4-
import type { HasChildren } from "~ui/utils/HasChildren"
4+
import type { MayHaveChildren } from "~ui/utils/MayHaveChildren"
55
import type { MayHaveClass } from "~ui/utils/MayHaveClass"
66
import { classMerge } from "~ui/utils/classMerge"
77

8-
interface CheckboxProps extends MayHaveClass, HasChildren, ComponentProps<"checkbox"> {
8+
interface CheckboxProps extends MayHaveClass, MayHaveChildren, ComponentProps<"checkbox"> {
99
id?: string
1010
checked: boolean
1111
onChange: (checked: boolean) => void

lib/interactive/details/Details.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import { mdiChevronDown } from "@mdi/js"
22
import { Show, type JSXElement } from "solid-js"
33
import { Icon1 } from "~ui/static/icon/Icon1"
4-
import type { HasChildren } from "~ui/utils/HasChildren"
4+
import type { MayHaveChildren } from "~ui/utils/MayHaveChildren"
55
import type { MayHaveClass } from "~ui/utils/MayHaveClass"
66
import type { MayHaveIcon } from "~ui/utils/MayHaveIcon"
77
import type { MayHaveSubtitle } from "~ui/utils/MayHaveSubtitle"
88
import type { MayHaveTitle } from "~ui/utils/MayHaveTitle"
99
import { classArr } from "~ui/utils/classArr"
1010
import { classMerge } from "~ui/utils/classMerge"
1111

12-
export interface DetailsProps extends MayHaveClass, MayHaveIcon, MayHaveTitle, MayHaveSubtitle, HasChildren {
12+
export interface DetailsProps extends MayHaveClass, MayHaveIcon, MayHaveTitle, MayHaveSubtitle, MayHaveChildren {
1313
summaryClass?: string
1414
summaryEl?: JSXElement
1515
}

lib/interactive/dialog/NativeDialog.tsx

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,19 @@ import {
1010
import { tbCloseDialog } from "~ui/interactive/dialog/tbCloseDialog"
1111
import { classMerge } from "~ui/utils/classMerge"
1212
import { createSignalObject, type SignalObject } from "~ui/utils/createSignalObject"
13-
import type { HasChildren } from "~ui/utils/HasChildren"
14-
import type { HasClass } from "~ui/utils/HasClass"
13+
import type { MayHaveChildren } from "~ui/utils/MayHaveChildren"
14+
import type { MayHaveClass } from "~ui/utils/MayHaveClass"
1515
import "./NativeDialog.module.css"
1616

1717
export type DialogButtonProps = Omit<ButtonIconProps, "id" | "type">
1818

19-
type DialogProps = {
19+
interface DialogProps extends MayHaveClass, MayHaveChildren, Partial<DialogInternalProps> {
2020
// trigger
2121
buttonProps: DialogButtonProps
2222
title: string
23-
} & HasClass &
24-
HasChildren &
25-
Partial<DialogInternalProps>
23+
}
2624

27-
type DialogInternalProps = {
25+
interface DialogInternalProps extends MayHaveClass, MayHaveChildren {
2826
// trigger
2927
buttonProps: DialogButtonProps
3028

@@ -42,8 +40,7 @@ type DialogInternalProps = {
4240
dialogId: string
4341
dialogRef: SignalObject<HTMLDialogElement | null>
4442
openState: IsOpenSignalObject
45-
} & HasClass &
46-
HasChildren
43+
}
4744

4845
function initProps(p: DialogProps): DialogInternalProps {
4946
let dialogRef = p.dialogRef ?? createSignalObject<HTMLDialogElement | null>(null)

0 commit comments

Comments
 (0)