Typescript检查字符串是否作为接口键存在

llew8vvj  于 2023-03-31  发布在  TypeScript
关注(0)|答案(3)|浏览(130)

我可以检查是否存在字符串作为接口键吗

interface list {
    one: string
    two: string
}

const myNumber = "one"

如何检查myNumber值是否为接口键

euoag5mw

euoag5mw1#

要做到这一点,你需要有一些东西让你在运行时获得接口的键。interface在运行时不存在-它纯粹是一个TypeScript构造,所以它不存在于发出的代码中。
创建一个包含键的数组,声明它为as const,这样它就不会被自动加宽类型,然后你就可以将它转换为List类型。然后你就有了一个类型和一个运行时数组,你可以使用.includes检查:

const listKeys = ['one', 'two'] as const;
type List = Record<typeof listKeys[number], string>;

// ...

const obj = {
    one: 'one',
    two: 'two',
    three: 'three'
};
// Transformation to string[] needed because of an odd design decision:
// https://github.com/Microsoft/TypeScript/issues/26255
const newObj = Object.fromEntries(
    Object.entries(obj).filter(
        ([key]) => (listKeys as unknown as string[]).includes(key)
    )
);

Playground链接

0mkxixxg

0mkxixxg2#

Typescript的类型不是值。
因此,JavaScript的操作是不可能的。
然而,在示例中,可以设置类型,使得myNumber是与键对应的类型。

interface list {
    one: string
    two: string
}

const myNumber: keyof list = "one"; // myNumber allow only "one" or "two";
blpfk2vs

blpfk2vs3#

你可以像这样使用typeguard函数,如果你有实现这个接口的对象:

interface List {
    one: string
    two: string
}

const list: List = {
    one: "some one"
    two: "some two"
}

function isListKey(value: string, list: IList): value is keyof List {
    return Object.keys(list).includes(value);
}

相关问题