假设我要编写这样的函数:
function foo(prop: string): { [prop]: string } {
return { [prop]: 'bar' };
}
有没有办法在Typescript中表达这一点?上面的代码实际上不起作用
答案 0 :(得分:0)
这并不完美(它包含as
,我不喜欢),但是它表达了您的想法:
function foo<K extends {}>(prop: keyof K): K {
return { [prop]: 'bar' } as K;
}
如果发现更好的地方,我将编辑此答案。
答案 1 :(得分:0)
我想你想要这个:
function foo<K extends PropertyKey>(prop: K): Record<K, string> {
return { [prop]: 'bar' } as Record<K, string>;
}
它必须是generic函数,以捕获prop
的特定literal类型,以便将其保留在输出中。输出类型是Record<K,V>
实用程序类型,它具有类型为K
的键和类型为V
的值。
您可以验证它是否有效:
const baz = foo("baz");
baz.baz.toUpperCase(); // okay
请注意,实现内的返回值必须为asserted才能匹配Record<K, string>
;这是因为存在出色的bug,即使您知道更具体的类型,例如[prop]
,string
这样的计算键也会扩展为K
。
好的,希望能有所帮助;祝你好运!