打字稿:检查值是否包含在类型中

时间:2017-11-30 12:04:18

标签: angular typescript types

我遇到定义类型的问题,并检查该类型中是否包含值。

以下是我的例子:

这些是类型:

export type Key = 'features' | 'special';

export type TabTypes = 'info' | 'features' | 'special' | 'stars';

当用户更改选项卡时,它会从Type of TabTypes中发送字符串值。

activeTabChanged(event: TabTypes) {
    this.activeTab: TabTypes = event;
    // it won't let me set the key here because key has a different type 
    // but the send event can be contained in type Key
    // how can I check if the send event from type TabTypes is contained in type Key
    this.key: Key = event;
}

是否有一种打字稿的方式来检查一个类型的发送值是否可以等于来自不同类型的值?

5 个答案:

答案 0 :(得分:1)

这个answer(类似问题)可能有用。它并不能完全回答您的问题,但是它显示了一种类似的方式来获得所需的结果。

简而言之,您可以使用数组进行包含检查,并使用type进行类型安全:

Conversation

答案 1 :(得分:0)

您可以使用typeof:

进行检查
console.log(typeof this.key === event); // return true or false

答案 2 :(得分:0)

如果您检查字符串是该类型的确切字符串,或者如果您检查它们不是Key类型中不符合的字符串,那么它将起作用:

export type Key = 'features' | 'special';

export type TabTypes = 'info' | 'features' | 'special' | 'stars';
function activeTabChanged(event: TabTypes) {
    var activeTab: TabTypes = event;
    if(event != 'info' && event != 'stars') {
        let key: Key = event;
    }
    // OR
    if(event == 'features' || event == 'special') {
        let key: Key = event;
    }
}

修改

type定义的问题是它在编译时被擦除,因此在运行时无法执行检查。在这个page和类型后卫上声明枚举的更冗长的方式可以帮助实现这个效果:

/** Utility function to create a K:V from a list of strings */
function strEnum<T extends string>(o: Array<T>): {[K in T]: K} {
    return o.reduce((res, key) => {
    res[key] = key;
    return res;
    }, Object.create(null));
}
const Key = strEnum([
    'features',
    'special',
])
type Key = keyof typeof Key;
function isKey(key: string) : key is Key {
    return Key[key] !== undefined;
}

export type TabTypes = 'info' | 'features' | 'special' | 'stars';


function activeTabChanged(event: TabTypes) {
    var activeTab: TabTypes = event;
    if(isKey(event)) {
        let key: Key = event;
    }
}

如果枚举很大,这个例子是值得的,否则第一个版本也可以正常工作。

答案 3 :(得分:0)

您可以使用字符串枚举。

export enum Keys = {
  Features = 'features',
  Special = 'special',
}

// Compare it
if (currentKey === Keys.Special) { console.log('Special key is set'); }

为了检查您的值是否在预定义的Enum中定义,您可以这样做:

if (currentKey in Keys) { console.log('valid key'); }

答案 4 :(得分:0)

2019解决方案:

我也有相同的需求,并找到了在另一个线程中执行此操作的更简单方法。总而言之,帕特里克·罗伯茨(Patrick Roberts)在该链接中(此问题值进行了更新)说的是:

  

不要过于复杂。

function isOfTypeTabs (keyInput: string): keyInput is TabTypes {
  return ['info', 'features', 'special', 'stars'].includes(keyInput);
}
  

有关为什么我们不仅仅使用boolean返回类型的更多信息,请参见What does the `is` keyword do in typescript?

此处的积分和完整资料:https://stackoverflow.com/a/57065680/6080254