打字稿:带接口的映射类型

时间:2018-03-14 17:56:22

标签: typescript types interface mapped-types

当尝试使用带接口的映射类型时,我得到一个奇怪的错误 - 这让我觉得根本不可能一起使用它们。

请参阅相同的类型和接口声明:

type AllWorks<T> = {
    [K in keyof T]: T[K];
}

interface DoesNotWork<T> {
    [K in keyof T]: T[K];
}

当第一个按预期工作时,第二个给出TS错误:

[ts] A computed property name must be of type 'string', 'number', 'symbol', or 'any'.
[ts] Member '[K in keyof' implicitly has an 'any' type.
[ts] Cannot find name 'keyof'.

所以我的问题是 - 甚至可以映射接口吗?如果是 - 那又如何?

2 个答案:

答案 0 :(得分:2)

到目前为止,在TypeScript中(从版本2.7.2开始),不允许在接口中使用联合类型签名,而应使用映射类型(正如您所拥有的那样)。

https://www.typescriptlang.org/docs/handbook/advanced-types.html

答案 1 :(得分:-1)

接口不是为了这样的目的而构建的。你应该在那里改用 fun goToDayAfter() { _theDate.value = _theValue!!.plusDays(1) }

Typescript 编译器告诉您您使用了错误的工具来完成这项工作:)

接口可以做的最复杂的事情是 Type 否则使用映射类型作为一般规则。

如果您想深入了解,我已经写了一篇关于映射类型的文章 here