如何从打字稿中的对象键获取类型键名称?
How to get type key name from object key in typescript?
type transaction = {
uid: string,
paymentMode : string,
}
我想从类型中获取键名,例如
function getFieldName(input) {
returns a string with key name
}
const tran : transaction = {}
getKeyName(tran.paymentMode) returns 'paymentMode'
我阅读了很多文章并尝试了一些解决方案,所以我知道我们至少需要为该类型创建对象,这很好。
我想这样做是因为需要一个类型的键名,而且我还想在我们键入类似 obj.key
的内容时保持键名的自动完成以避免错误。
我知道,我可以从具有常量键值对的类型创建一个单独的对象。我想避免这种情况,因为一旦类型发生变化,我们就需要在 2 个地方更改相同的东西,这可能会被遗漏。
编辑:
我正在寻找这个 - nameof in c#。 @Aleksey L. 在评论中这样说。
这似乎是您想要的函数签名类型:
Note that it meets your criteria of compatibility with IntelliSense auto-complete/suggest:
type Transaction = {
uid: string;
paymentMode: string;
};
function getFieldName <T extends object, K extends keyof T>(o: T, key: K): K {
return key;
}
const transaction: Transaction = {
uid: window.crypto.randomUUID(),
paymentMode: 'unknown',
};
getFieldName(transaction, 'uid'); // "uid"
getFieldName(transaction, 'paymentMode'); // "paymentMode"
getFieldName(transaction, 'asdf'); /*
~~~~~~
Argument of type '"asdf"' is not assignable to parameter of type 'keyof Transaction'.(2345) */
无法通过传递对 属性 值的引用来派生 JavaScript(或 TypeScript)中的字符串 属性 名称。 JavaScript目前根本没有这种meta-introspection能力
看来你的问题不仅仅是关于类型安全,而是关于 DX/ergonomics。上述解决方案确实需要提供 属性 名称,但在获得 IntelliSense 提示之前要键入的额外字符数仅为 1(如果考虑空格则为 2):
// For: obj.prop:
// desired:
fn(obj.p_)
// 012^
// proposed:
fn(obj, 'p_')
// 01234^
// The closing quote is auto-inserted by IntelliSense, just like the closing parenthesis.
type transaction = {
uid: string,
paymentMode : string,
}
我想从类型中获取键名,例如
function getFieldName(input) {
returns a string with key name
}
const tran : transaction = {}
getKeyName(tran.paymentMode) returns 'paymentMode'
我阅读了很多文章并尝试了一些解决方案,所以我知道我们至少需要为该类型创建对象,这很好。
我想这样做是因为需要一个类型的键名,而且我还想在我们键入类似 obj.key
的内容时保持键名的自动完成以避免错误。
我知道,我可以从具有常量键值对的类型创建一个单独的对象。我想避免这种情况,因为一旦类型发生变化,我们就需要在 2 个地方更改相同的东西,这可能会被遗漏。
编辑:
我正在寻找这个 - nameof in c#。 @Aleksey L. 在评论中这样说。
这似乎是您想要的函数签名类型:
Note that it meets your criteria of compatibility with IntelliSense auto-complete/suggest:
type Transaction = {
uid: string;
paymentMode: string;
};
function getFieldName <T extends object, K extends keyof T>(o: T, key: K): K {
return key;
}
const transaction: Transaction = {
uid: window.crypto.randomUUID(),
paymentMode: 'unknown',
};
getFieldName(transaction, 'uid'); // "uid"
getFieldName(transaction, 'paymentMode'); // "paymentMode"
getFieldName(transaction, 'asdf'); /*
~~~~~~
Argument of type '"asdf"' is not assignable to parameter of type 'keyof Transaction'.(2345) */
无法通过传递对 属性 值的引用来派生 JavaScript(或 TypeScript)中的字符串 属性 名称。 JavaScript目前根本没有这种meta-introspection能力
看来你的问题不仅仅是关于类型安全,而是关于 DX/ergonomics。上述解决方案确实需要提供 属性 名称,但在获得 IntelliSense 提示之前要键入的额外字符数仅为 1(如果考虑空格则为 2):
// For: obj.prop:
// desired:
fn(obj.p_)
// 012^
// proposed:
fn(obj, 'p_')
// 01234^
// The closing quote is auto-inserted by IntelliSense, just like the closing parenthesis.