如何使用地图类型为 `Object.keys` 定义类型?
How to use map types to define a type for `Object.keys`?
我想使用打字稿映射类型定义更严格的Object.keys
函数。
示例:
假设我有一个用 const
:
定义的对象
const myObj = {
a: 'some value',
b: 5
};
当我在这个对象上使用 Object.keys
时,返回类型是 string[]
const keysOfMyObj = Object.keys(myObj); // `const keysOfMyObj: string[]`
问题:
相反,我希望这种类型更具体。我宁愿 Object.keys
返回类型 ("a" | "b")[]
.
而不是返回类型 string[]
所需类型:
const newKeysOfMyObj = myKeys(myObj); // `const newKeysOfMyObj: ("a" | "b")[]`
我尝试过的:
我认为这可以使用 typescript mapped types 来完成。
我定义了一个断言类型是对象的值与键相同的类型:
type Keys<T> = {
[P in keyof T]: P;
};
let myObjKeysOnly: Keys<typeof myObj>;
// resulting type:
// ```
// let myObjKeysOnly: {
// a: "a";
// b: "b";
// }
// ```
我试图将此函数实现为 Object.keys
:
的类型化包装器
function myKeys<T>(obj: T) {
return Object.keys(obj) as (Keys<T>);
}
有什么想法吗?
您可以使用 keyof
:
function myKeys<T>(obj: T): keyof T[] {
return Object.keys(obj) as any;
}
const x = myKeys({ a: 123, b: 123 });
更多
移动类型:https://basarat.gitbooks.io/typescript/content/docs/types/moving-types.html
我想使用打字稿映射类型定义更严格的Object.keys
函数。
示例:
假设我有一个用 const
:
const myObj = {
a: 'some value',
b: 5
};
当我在这个对象上使用 Object.keys
时,返回类型是 string[]
const keysOfMyObj = Object.keys(myObj); // `const keysOfMyObj: string[]`
问题:
相反,我希望这种类型更具体。我宁愿 Object.keys
返回类型 ("a" | "b")[]
.
string[]
所需类型:
const newKeysOfMyObj = myKeys(myObj); // `const newKeysOfMyObj: ("a" | "b")[]`
我尝试过的:
我认为这可以使用 typescript mapped types 来完成。
我定义了一个断言类型是对象的值与键相同的类型:
type Keys<T> = {
[P in keyof T]: P;
};
let myObjKeysOnly: Keys<typeof myObj>;
// resulting type:
// ```
// let myObjKeysOnly: {
// a: "a";
// b: "b";
// }
// ```
我试图将此函数实现为 Object.keys
:
function myKeys<T>(obj: T) {
return Object.keys(obj) as (Keys<T>);
}
有什么想法吗?
您可以使用 keyof
:
function myKeys<T>(obj: T): keyof T[] {
return Object.keys(obj) as any;
}
const x = myKeys({ a: 123, b: 123 });
更多
移动类型:https://basarat.gitbooks.io/typescript/content/docs/types/moving-types.html