【问题标题】:Typescript type mapping to expect an object where every property is of a given type打字稿类型映射以期望每个属性都属于给定类型的对象
【发布时间】:2017-02-06 23:23:40
【问题描述】:

在打字稿中,我有一个 X 类型的接口。我有一个方法,它需要一个具有任意数量属性的对象,但每个属性都必须是 X 类型。例如,这两个都可以作为参数传递:

interface IJays {
    jim: X;
    jone: X;
    jan: X;
}

interface IBees {
    bill: X;
    bob: X;
    betty: X;
}

但这不是作为参数传递的有效类型:

interface ISees {
    claude: X;
    carol: boolean;
    clem: number;
}

在这种情况下,属性的名称也很重要(它们在处理中使用)。

如果我可以使用不同的数据结构,那就太好了,但这是来自某些 API 的结构。我也没有所有接口的有限列表。随着项目的发展,将会有许多遵循这种模式的接口。

目前,我将此属性键入为“any”,但我真的希望将其作为特定类型以防止将来出现错误(这是将来容易出错的那种东西)。

有没有办法将其指定为打字稿中的类型?本质上,一个任意对象,该对象的每个属性都属于特定类型?也许使用新的Mapped Types 功能?

【问题讨论】:

  • 如果知道所有值都是同一类型而不知道该类型是什么或您将拥有什么属性,您会获得什么样的信息?

标签: typescript


【解决方案1】:

在我看来,您有两个选择:

(1) 具有泛型值类型的函数:

interface IJays {
    jim: string;
    jone: string;
    jan: string;
}

interface IBees {
    bill: string;
    bob: string;
    betty: string;
}

interface ISees {
    claude: string;
    carol: boolean;
    clem: number;
}

function fn<T, V>(o: { [key in keyof T]: V }) { /* ... */ }

let a: IJays = { jim: "jim", jone: "jone", jan: "jan" };
fn<IJays, string>(a); // fine

let b: IBees = { bill: "bill", bob: "bob", betty: "betty" };
fn<IBees, string>(b); // fine

let c: ISees = { claude: "claude", carol: true, clem: 3 };
fn<ISees, string>(c); // error

(code in playground)

但正如您所见,您必须在调用函数时指定通用约束,因为编译器无法推断它们。
如果你不想这样做,那么选项 #2。

(2) 每种类型都有不同的功能:

function fnString<T>(o: { [key in keyof T]: string }) { /* ... */ }
function fnNumber<T>(o: { [key in keyof T]: number }) { /* ... */ }

let a: IJays = { jim: "jim", jone: "jone", jan: "jan" };
fnString(a); // fine

let b: IBees = { bill: "bill", bob: "bob", betty: "betty" };
fnString(b); // fine

let c: ISees = { claude: "claude", carol: true, clem: 3 };
fnString(c); // error

(code in playground)

这里编译器可以推断出通用约束,但您需要为每种类型提供不同的函数。

【讨论】:

    猜你喜欢
    • 2020-06-01
    • 2021-04-02
    • 2021-12-16
    • 2021-12-06
    • 2019-11-19
    • 2017-09-06
    • 2021-06-19
    • 2018-01-18
    • 2022-12-07
    相关资源
    最近更新 更多