2017-08-24 48 views
2

分配到(或断言)never在函数的末尾全面性检查是为了迫使详尽检查编译时用于打字稿使用的技术。没有明确串

但是,为了让编译器检测到这一点,它需要显式字符串来检查以确定函数是否在never的赋值/断言之前确实返回。

有没有可能引进某种Object.freeze的类型变化,仅适用于对象的文字,并进一步与链,使像下面可以做?

更好的是,有没有办法创建一个接口,其中的按键自动为的Action.type(本例中为)?如果是这种情况 - actionMap可以简单地声明为该接口,这将强制在编译时检查。

两者都是同样的问题......只给一个识别联合解决方案,是有可能做全面性检查,这样,在编译时,无需在函数中使用明确的字符串?

interface Increment { 
    type: 'increment' 
} 

interface Decrement { 
    type: 'decrement' 
} 

type Action = Increment | Decrement 

const inc: Increment = { type: 'increment' }; 
const dec: Decrement = { type: 'decrement' }; 

//this would be a typescript variation 
const actionMap = Object.freeze({ 
    [inc.type]: n => n + 1, 
    [dec.type]: n => n-1 
}); 


function doAction(action: Action, val: number): number { 

    if(actionMap[action.type]) { 
     return actionMap[action.type](val); 
    } 

    //this would error at compile time if the above checked failed 
    const _exhaustiveCheck: never = action; 
} 

console.log(doAction(inc, 1)); 
console.log(doAction(dec, 1)); 
+0

只是要清楚。您想检查actionMap是否有区别联合Action中所有'type'值的值。它是否正确? –

+0

是的!那就对了 :) – davidkomer

回答

3

有做一个地图,保证它有一个可识别联合每种情况下的值相当直接的方式。你只需要设置它,使其键的类型是区分的联合标识符。

type ActionMap = { 
    [P in Action["type"]]: (val:number)=>number 
}; 

然后,您可以实现此接口,这将是这个样子:

var map: ActionMap = { 
    decrement: n => n - 1, 
    increment: n=> n + 1 
} 

编辑:一堆乱搞后,我发现了一个更加灵活和强大的解决方案,让您不只键入区分的联合值的键,但也允许你键入有效载荷。

第一个:以key:type对的形式定义您的联合。 (我认为这是清洁反正阅读)

type Actions = { 
    "increment": { incrementValue: number } 
    "decrement": { decrementValue: number } 
} 

:从地图创建一个动作识别联合。这不是世界上最清晰的代码,它所做的是为ActionsMap中的每个键值对通过添加类型值{type:key}创建一个新类型,然后将所有这些类型相加在一起以创建您的区分联盟。

type Action = { 
    [P in keyof Actions]: { type: P } & ActionsMap[P] 
}[keyof Actions]; 

:您的地图

type ActionsMap = { 
    [P in keyof Actions]: (val:number,action:Actions[P])=>number 
} 

第四创建类型:享受你完全类型安全的动作/减速地图!

const map:ActionsMap = { 
    decrement: (val, action) => val + action.decrementValue, 
    increment: (val, action) => val + action.incrementValue, 
} 

公平的警告。这极大地推动了打字稿定义可以做什么的限制,并且我个人已经因为依赖一些打字稿边缘行为而只是为了让它在下一个版本中被更改而被咬伤。

相关问题