类型“ T”不可分配给类型“字符串”

时间:2019-12-10 15:25:25

标签: typescript typescript3.0

这是问题所在:我想创建一个获取参数并返回相同类型的函数。

我使最简单的示例成为可能:

type Test = <T>(arg: T) => T;
const test: Test = (arg: string) => arg;

这种简单的Test类型功能的实现会引发错误“ Type'T'不可分配给'string'类型”

有人可以解释我为什么不使用模板化参数中的道具时会发生此错误吗?

2 个答案:

答案 0 :(得分:2)

https://github.com/Microsoft/TypeScript/issues/30496实际上对此有答案:Test是泛型类型。您的定义不符合通用类型,因为无法将T分配给string。您应该能够使用test<number>(num)并使其正常工作,但是如果arg是字符串,那将是不兼容的。

不过,您可以使类型通用。这样可以在声明函数类型时缩小类型。

type Test<T> = (arg: T) => T;
const test<string> = arg => arg; //arg is a string;

答案 1 :(得分:0)

谢谢您的回答爆炸药。 问题是我必须让模板自行解决,因此我只是在不指定类型的情况下创建了函数,而且效果也很好。

type Test = <T>(arg: T) => T;
const test: Test = (arg) => arg;

这里是我正在使用的原始功能:

type VariableReducer = <T>(
  array: { label: string; value: T }[],
  variable: Readonly<IVariableDescriptor> | undefined,
  key: string,
) => { label: string; value: T }[];

const defaultVariableReducer: VariableReducer = (a, v) =>
  (v !== undefined && v.name !== undefined
    ? [...a, { label: editorLabel(v), value: v.name }]
    : a) as typeof a;