javascript - 在 typescript 中指定 keyof 类型

标签 javascript typescript

有没有办法指定类型中已定义的键?

interface KeyType {
 userName: string,
 address: string
}

type ValidationType = {
 userName: ValidateUserNameType;
 address: ValidateAddressType;
}

这些 KeyTypeValidationType 用于不同的用途,但 ValidationType 键将始终与 KeyType 相同>.

我四处寻找,但没有运气

最佳答案

您可以定义强制执行相同键的自定义类型:

type SameKeys<T, U extends Record<keyof T, any>> =
    { [K in keyof U]: K extends keyof T ? U[K] : never }

// e.g.
type SameKeysValidationType = SameKeys<KeyType, ValidationType>

U 必须扩展 T 中的所有键。如果U有更多属性,它们将被解析为never值类型。但这不会引发编译错误 - 这里有两个选项:

接口(interface)扩展

interface ValidationType extends SameKeys<KeyType, ValidationType> {
    userName: ValidateUserNameType;
    address: ValidateAddressType;   // comment => compile error
    // foo: string                  // uncomment => compile error
}

断言类型

// generic assert type
type AssertSameKeys<T, U extends Record<keyof T, any> & SameKeys<T, U>> = true

// this will error, when ValidationType is not proper
type AssertValidationType = AssertSameKeys<KeyType, ValidationType> 

以上变体适用于您的情况。您仍然应该评估和测试您想要对可选属性和其他边缘情况执行的操作。

Playground sample here

关于javascript - 在 typescript 中指定 keyof 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60371530/

相关文章:

javascript - iPhone 因向 webview 提供 base64 导致崩溃

javascript - 网页中的移动检测未捕获语法错误 : Unexpected token || in console

javascript - 为什么 e.name 不返回与 e().name 相同的值?不是事件对象

typescript - 模块 '...' 解析为非模块实体,无法使用此构造导入

javascript - 具有动态内容的 Angular 通用更新元标记

javascript - 帖子内的图片逐渐调整大小,在 Android 浏览器中宽度和高度为零

javascript - 如果变量从未使用过,它会自动从内存中释放吗?

angular - 给出特定响应时取消订阅 Angular2 方法?

javascript - 使用 ionic 2 而不是 typescript 应用程序创建一个 javascript 入门应用程序

angular - 如何获取对象数组值