如何在Typescript中表达此功能签名?

时间:2019-11-11 17:02:35

标签: typescript

假设我要编写这样的函数:

function foo(prop: string): { [prop]: string } {
  return { [prop]: 'bar' };
}

有没有办法在Typescript中表达这一点?上面的代码实际上不起作用

2 个答案:

答案 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

好的,希望能有所帮助;祝你好运!

Link to code