TypeScript中的键和值类型

时间:2018-11-01 06:36:04

标签: typescript generics types typescript3.0

interface A { a?: number };
interface B { a?: string };

function copy<
    Source extends object,
    Destination extends { [destinationKey in keyof Source]?: (1) }
>(
    source: Source,
    key: keyof Source,
    destination: Destination,
    transformer: (value: (2)) => (3) 
) {
    if (source[key] !== undefined) {
        destination[key] = transformer ? transformer(source[key]) : source[key];
    }
}

const a: A = { a: 123 };
const b: B = {};

copy(a, "a", b, (value) => value.toString());

在上面的示例中,我可以用于以下占位符:

  • (1)-与Destination中相应键关联的Source中的值类型。
  • (2)-Source中与参数key指定的键关联的值的类型。
  • (3)-与参数Destination指定的键关联的key中的值类型。

1 个答案:

答案 0 :(得分:1)

您需要一个额外的类型参数,表示将要传递的实际键。该参数将根据传递给key参数的值推断为字符串文字类型。使用这种新类型,我们可以使用类型查询来获取SourceDestination类型中type的特定属性。

此外,由于我们只关心特定的K键,因此我们在定义Destination类型为具有键时可以使用它(而不是指定Destination必须具有{ {1}})。由于我们实际上并不关心目标属性的类型,因此它只是存在并且Source函数必须返回与此属性相同类型的值,因此我们可以在{中指定属性的类型{1}}为transformer

Destination