gpt4 book ai didi

typescript - TypeScript中有没有类似于 `valueof`的 `keyof`?

转载 作者:搜寻专家 更新时间:2023-10-30 20:28:55 26 4
gpt4 key购买 nike

我希望能够将对象属性分配给给定键和值作为输入的值,但仍然能够确定值的类型。这有点难以解释,所以这段代码应该可以揭示问题:

type JWT = { id: string, token: string, expire: Date };
const obj: JWT = { id: 'abc123', token: 'tk01', expire: new Date(2018, 2, 14) };

function print(key: keyof JWT) {
switch (key) {
case 'id':
case 'token':
console.log(obj[key].toUpperCase());
break;
case 'expire':
console.log(obj[key].toISOString());
break;
}
}

function onChange(key: keyof JWT, value: any) {
switch (key) {
case 'id':
case 'token':
obj[key] = value + ' (assigned)';
break;
case 'expire':
obj[key] = value;
break;
}
}

print('id');
print('expire');
onChange('id', 'def456');
onChange('expire', new Date(2018, 3, 14));
print('id');
print('expire');

onChange('expire', 1337); // should fail here at compile time
print('expire'); // actually fails here at run time

我尝试将 value: any 更改为 value: valueof JWT 但这没有用。

理想情况下,onChange('expire', 1337) 会失败,因为 1337 不是 Date 类型。

如何将 value: any 更改为给定键的值?

最佳答案

更新:看起来问题标题吸引了人们寻找所有可能的属性值类型的联合,类似于 keyof 为您提供所有可能的属性键类型的联合的方式。让我们先帮助那些人。你可以制作一个类似于 keyofValueOf,通过使用 indexed access typeskeyof T 作为键,像这样:

type ValueOf<T> = T[keyof T];

这给了你

type Foo = { a: string, b: number };
type ValueOfFoo = ValueOf<Foo>; // string | number

对于所述问题,您可以使用比 keyof T 更窄的单独键来提取您关心的值类型:

type sameAsString = Foo['a']; // look up a in Foo
type sameAsNumber = Foo['b']; // look up b in Foo

为了确保键/值对在函数中正确“匹配”,您应该使用 generics 以及索引访问类型,如下所示:

declare function onChange<K extends keyof JWT>(key: K, value: JWT[K]): void; 
onChange('id', 'def456'); // okay
onChange('expire', new Date(2018, 3, 14)); // okay
onChange('expire', 1337); // error. 1337 not assignable to Date

想法是 key 参数允许编译器推断通用 K 参数。然后它要求 value 匹配 JWT[K],即您需要的索引访问类型。

关于typescript - TypeScript中有没有类似于 `valueof`的 `keyof`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49285864/

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