Skip to content

Commit 89efa1a

Browse files
authored
Merge pull request #378 from wooloo26/master
improve types
2 parents 86cc221 + 6f18e24 commit 89efa1a

File tree

2 files changed

+46
-42
lines changed

2 files changed

+46
-42
lines changed

src/reconcile.ts

+43-38
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import {
22
IFiber,
33
FreElement,
44
FC,
5-
Attributes,
65
HTMLElementEx,
76
FreNode,
87
HookEffect,
@@ -23,10 +22,10 @@ export const enum TAG {
2322
SVG = 1 << 4,
2423
DIRTY = 1 << 5,
2524
MOVE = 1 << 6,
26-
REPLACE = 1 << 7
25+
REPLACE = 1 << 7,
2726
}
2827

29-
export const render = (vnode: FreElement, node: Node): void => {
28+
export const render = (vnode: FreElement, node: Node) => {
3029
rootFiber = {
3130
node,
3231
props: { children: vnode },
@@ -41,23 +40,24 @@ export const update = (fiber?: IFiber) => {
4140
}
4241
}
4342

44-
const reconcile = (fiber?: IFiber): boolean => {
43+
const reconcile = (fiber?: IFiber) => {
4544
while (fiber && !shouldYield()) fiber = capture(fiber)
46-
if (fiber) return reconcile.bind(null, fiber)
45+
if (fiber) return reconcile.bind(null, fiber) as typeof reconcile
4746
return null
4847
}
4948

50-
const memo = (fiber) => {
49+
const memo = (fiber: IFiber) => {
5150
if ((fiber.type as FC).memo && fiber.old?.props) {
5251
let scu = (fiber.type as FC).shouldUpdate || shouldUpdate
53-
if (!scu(fiber.props, fiber.old.props)) { // fast-fix
52+
if (!scu(fiber.props, fiber.old.props)) {
53+
// fast-fix
5454
return getSibling(fiber)
5555
}
5656
}
5757
return null
5858
}
5959

60-
const capture = (fiber: IFiber): IFiber | undefined => {
60+
const capture = (fiber: IFiber) => {
6161
fiber.isComp = isFn(fiber.type)
6262
if (fiber.isComp) {
6363
const memoFiber = memo(fiber)
@@ -73,7 +73,7 @@ const capture = (fiber: IFiber): IFiber | undefined => {
7373
return sibling
7474
}
7575

76-
const getSibling = (fiber) => {
76+
const getSibling = (fiber?: IFiber) => {
7777
while (fiber) {
7878
bubble(fiber)
7979
if (fiber.dirty) {
@@ -87,7 +87,7 @@ const getSibling = (fiber) => {
8787
return null
8888
}
8989

90-
const bubble = fiber => {
90+
const bubble = (fiber: IFiber) => {
9191
if (fiber.isComp) {
9292
if (fiber.hooks) {
9393
side(fiber.hooks.layout)
@@ -96,40 +96,42 @@ const bubble = fiber => {
9696
}
9797
}
9898

99-
100-
const shouldUpdate = (a, b) => {
99+
const shouldUpdate = (
100+
a: Record<string, unknown>,
101+
b: Record<string, unknown>
102+
) => {
101103
for (let i in a) if (!(i in b)) return true
102104
for (let i in b) if (a[i] !== b[i]) return true
103105
}
104106

105-
const updateHook = <P = Attributes>(fiber: IFiber): any => {
107+
const updateHook = (fiber: IFiber) => {
106108
resetCursor()
107109
currentFiber = fiber
108-
let children = (fiber.type as FC<P>)(fiber.props)
110+
let children = (fiber.type as FC)(fiber.props)
109111
reconcileChidren(fiber, simpleVnode(children))
110112
}
111113

112-
const updateHost = (fiber: IFiber): void => {
113-
fiber.parentNode = (getParentNode(fiber) as any) || {}
114+
const updateHost = (fiber: IFiber) => {
115+
fiber.parentNode = getParentNode(fiber) || {}
114116
if (!fiber.node) {
115117
if (fiber.type === 'svg') fiber.lane |= TAG.SVG
116-
fiber.node = createElement(fiber) as HTMLElementEx
118+
fiber.node = createElement(fiber)
117119
}
118120
reconcileChidren(fiber, fiber.props.children)
119121
}
120122

121123
const simpleVnode = (type: any) =>
122124
isStr(type) ? createText(type as string) : type
123125

124-
const getParentNode = (fiber: IFiber): HTMLElement | undefined => {
126+
const getParentNode = (fiber: IFiber) => {
125127
while ((fiber = fiber.parent)) {
126128
if (!fiber.isComp) return fiber.node
127129
}
128130
}
129131

130-
const reconcileChidren = (fiber: any, children: FreNode): void => {
132+
const reconcileChidren = (fiber: IFiber, children: FreNode) => {
131133
let aCh = fiber.kids || [],
132-
bCh = (fiber.kids = arrayfy(children) as any)
134+
bCh = (fiber.kids = arrayfy(children))
133135
const actions = diff(aCh, bCh)
134136

135137
for (let i = 0, prev = null, len = bCh.length; i < len; i++) {
@@ -156,46 +158,49 @@ function clone(a, b) {
156158
b.old = a
157159
}
158160

159-
export const arrayfy = arr => (!arr ? [] : isArr(arr) ? arr : [arr])
161+
export const arrayfy = (arr: unknown) => (!arr ? [] : isArr(arr) ? arr : [arr])
160162

161-
const side = (effects: HookEffect[]): void => {
162-
effects.forEach(e => e[2] && e[2]())
163-
effects.forEach(e => (e[2] = e[0]()))
163+
const side = (effects: HookEffect[]) => {
164+
effects.forEach((e) => e[2] && e[2]())
165+
effects.forEach((e) => (e[2] = e[0]()))
164166
effects.length = 0
165167
}
166168

167169
const diff = function (a, b) {
168170
var actions = [],
169171
aIdx = {},
170172
bIdx = {},
171-
key = v => v.key + v.type,
172-
i, j;
173+
key = (v) => v.key + v.type,
174+
i,
175+
j
173176
for (i = 0; i < a.length; i++) {
174-
aIdx[key(a[i])] = i;
177+
aIdx[key(a[i])] = i
175178
}
176179
for (i = 0; i < b.length; i++) {
177-
bIdx[key(b[i])] = i;
180+
bIdx[key(b[i])] = i
178181
}
179-
for (i = j = 0; i !== a.length || j !== b.length;) {
180-
var aElm = a[i], bElm = b[j];
182+
for (i = j = 0; i !== a.length || j !== b.length; ) {
183+
var aElm = a[i],
184+
bElm = b[j]
181185
if (aElm === null) {
182-
i++;
186+
i++
183187
} else if (b.length <= j) {
184188
removeElement(a[i])
185-
i++;
189+
i++
186190
} else if (a.length <= i) {
187191
actions.push({ op: TAG.INSERT, elm: bElm, before: a[i] })
188-
j++;
192+
j++
189193
} else if (key(aElm) === key(bElm)) {
190194
clone(aElm, bElm)
191195
actions.push({ op: TAG.UPDATE })
192-
i++; j++;
196+
i++
197+
j++
193198
} else {
194199
var curElmInNew = bIdx[key(aElm)]
195200
var wantedElmInOld = aIdx[key(bElm)]
196201
if (curElmInNew === undefined) {
197202
removeElement(a[i])
198-
i++;
203+
i++
199204
} else if (wantedElmInOld === undefined) {
200205
actions.push({ op: TAG.INSERT, elm: bElm, before: a[i] })
201206
j++
@@ -211,6 +216,6 @@ const diff = function (a, b) {
211216
}
212217

213218
export const getCurrentFiber = () => currentFiber || null
214-
export const isFn = (x: any): x is Function => typeof x === 'function'
215-
export const isStr = (s: any): s is number | string =>
216-
typeof s === 'number' || typeof s === 'string'
219+
export const isFn = (x: unknown): x is Function => typeof x === 'function'
220+
export const isStr = (s: unknown): s is number | string =>
221+
typeof s === 'number' || typeof s === 'string'

src/type.ts

+3-4
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@ export interface FreElement<P extends Attributes = any, T = string> {
2828
key: string
2929
}
3030

31-
export type HookTypes = 'list' | 'effect' | 'layout'
32-
3331
export interface Hooks {
3432
list: HookList[]
3533
layout: HookEffect[]
@@ -47,22 +45,23 @@ export type HookReducer<V = any, A = any> = [value: V, dispatch: Dispatch<A>]
4745
export interface IFiber<P extends Attributes = any> {
4846
key?: string
4947
type: string | FC<P>
50-
parentNode: HTMLElementEx
48+
parentNode: HTMLElementEx | {}
5149
node: HTMLElementEx
5250
kids?: any
5351
dirty: boolean
5452
parent?: IFiber<P>
5553
sibling?: IFiber<P>
5654
child?: IFiber<P>
5755
ref?: Ref<HTMLElement | undefined>
56+
old?: IFiber
5857
hooks?: Hooks
5958
action: any
6059
props: P
6160
lane: number
6261
isComp: boolean
6362
}
6463

65-
export type HTMLElementEx = HTMLElement & { last: IFiber | null }
64+
export type HTMLElementEx = HTMLElement | Text | SVGElement
6665

6766
export type FreText = string | number
6867
export type FreNode =

0 commit comments

Comments
 (0)