【问题标题】:How can I check that a string is a property a particular interface in TypeScript如何检查字符串是否是 TypeScript 中特定接口的属性
【发布时间】:2019-05-31 02:31:32
【问题描述】:

我确实有一个现实世界的情况,我需要使用字符串文字按名称引用属性。我想让那个类型安全,感觉就像在 TypeScript 中一样,这应该是可能的。考虑以下简化示例:

interface MyInterface {
    foo: string,
}

const barName = <keyof MyInterface>'bar'    // No error?
const bazName = 'baz' as keyof MyInterface  // No error?
const bopName:keyof MyInterface = 'bop' // Finally, an error!

我相信答案是 TypeScript 中的 &lt;&gt;as 操作是“类型断言”而不是“类型转换尝试”。上面的前两个 const 基本上是在说:“相信我,这 MyInterface 的一个键”,而第三个 const 尝试进行类型化赋值,但失败了。

我想知道我是否正确,如果正确,是否有其他内联方法可以测试字符串文字是否是给定接口的键,而不需要创建临时变量。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    您在前两个 const 声明中没有收到错误的原因是正确的。

    在变量上没有显式类型注释的情况下获得错误的唯一方法是使用辅助函数:

    interface MyInterface {
        foo: string,
    }
    const key = <T>(o: keyof T) => o;
    const barName = key<MyInterface>('bar')    // error
    const fooName = key<MyInterface>('foo')    // ok
    

    您也可以保留const 声明,const 将被键入为与字符串文字相关联的字符串文字类型,当您第一次使用它来索引 @ 的实例时会出错987654326@,尽管这可能不适用于所有情况。

    【讨论】:

    • 谢谢。该函数是一个很好的解决方案,并且具有所需的编译时效果。不幸的是,它在编译过程中并没有消失,最终在生成的 JavaScript 中作为函数调用。对于那些对性能影响感到好奇的人,有一个相关的讨论 on GitHub 关于这种简单函数的运行时性能。 (tl;dr:它对性能的影响为零)
    猜你喜欢
    • 2021-12-25
    • 2020-04-30
    • 1970-01-01
    • 2017-12-16
    • 2020-11-24
    • 2014-01-08
    • 1970-01-01
    • 2018-09-28
    • 2019-09-30
    相关资源
    最近更新 更多