From b3bd95dbafdec21a3ff3ac8eaecaa777de841476 Mon Sep 17 00:00:00 2001 From: Justin Miller Date: Tue, 19 Dec 2017 09:19:01 -0700 Subject: [PATCH] fix(ts-lens): Have the fallback dictate type fixes #1 --- src/lens.ts | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/lens.ts b/src/lens.ts index 8cf6e82..a0b3e34 100644 --- a/src/lens.ts +++ b/src/lens.ts @@ -1,10 +1,15 @@ const getKey = (key: Key) => (value: T): T[Key] => value && value[key]; -const getOrKey = ( +const getOrKey = ( key: Key, - orValue: OrValue & T[Key] -) => (value: T): T[Key] => (value && value[key]) || orValue; + orValue: OrValue +) => (value: T): OrValue => { + if (value && value.hasOwnProperty(key)) { + return (value && value[key]) as any; + } + return orValue; +}; const setKey = (key: Key, setValue: T[Key]) => ( value: T @@ -62,10 +67,13 @@ export class Lens { /** Like thenKey but now we have a default * Ex: Get a value in a model dictionary or return the default */ - public thenKeyOr(key: Key, defaultValue: C & B[Key]) { + public thenKeyOr( + key: Key, + defaultValue: C + ) { return this.then( - new Lens(getOrKey(key, defaultValue), (value: C & B[Key]) => - setKey(key, value) + new Lens(getOrKey(key, defaultValue), (value: C) => + setKey(key, value as any) ) ); }