gpt4 book ai didi

typescript - 键入静态对象的值,同时保留其键类型不变

转载 作者:行者123 更新时间:2023-12-05 04:49:18 25 4
gpt4 key购买 nike

假设我有以下接口(interface)和对象:

interface Person {
name: string;
lastName?: string;
}

const obj: { [key: string]: Person } = {
a: { name: 'John' },
b: { name: 'Jane', lastName: 'Doe' },
}

这定义了对象的类型,它的键可以是任何字符串。但我仍然希望能够推断出对象的键(因为它是静态的),在这种情况下,我不能。

我可以这样做:

type ObjKeys = 'a' | 'b';

const obj: { [key in ObjKeys]: Person } //...

但是它很冗长。

是否有一种简短的说法“这是该对象所有值的类型,但保留静态定义的键?”

最佳答案

您不能纯粹在类型级别执行此操作;如果你annotate obj 的类型为 {[k: string]: Person} 那么编译器将假定这是要使用的实际类型,而不是 narrow它根据 {a: {...}, b: {...}} 的分配给其他东西。这样control flow analysis只发生在类型为 union 的值上, 并且 {[k: string]: Person} 不是联合。

在这种情况下我通常做的是写一个 generic助手 identity function编译器可以从中推断出您要查找的类型:

const asPersonDict = <K extends PropertyKey>(
o: { [P in K]: Person }) => o;

然后调用辅助函数而不是注释类型:

const obj = asPersonDict({
a: { name: 'John' },
b: { name: 'Jane', lastName: 'Doe' },
});

/* const obj: {
a: Person;
b: Person;
} */

Playground link to code

关于typescript - 键入静态对象的值,同时保留其键类型不变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67641603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com