【发布时间】:2020-11-18 22:27:41
【问题描述】:
我写了一个相当简单的基于映射类型的代码,由于某种原因不想进行类型检查。
首先,定义输入和输出:
interface Validated<T> {
valid: boolean;
value: T;
}
interface FieldInputs {
name: string;
price: number;
}
interface ParsedFields {
name: Validated<string>;
price: Validated<number>;
}
定义解析器类型和解析器映射:
type FieldKey = keyof FieldInputs & keyof ParsedFields;
type FieldParser<F extends FieldKey> = (value?: FieldInputs[F]) => ParsedFields[F];
type FieldParsers = {
[F in FieldKey]: FieldParser<F>;
};
declare let fieldParsers: FieldParsers;
现在这个非常简单的泛型函数无法进行类型检查:
function update<F extends FieldKey>(field: F, value: FieldInputs[F]) {
const parser: FieldParser<F> = fieldParsers[field];
parser.apply(value);
}
给出以下错误 (--strictFunctionTypes):
Type 'FieldParsers[F]' is not assignable to type 'FieldParser<F>'.
Type 'FieldParser<"name"> | FieldParser<"price">' is not assignable to type 'FieldParser<F>'.
Type 'FieldParser<"name">' is not assignable to type 'FieldParser<F>'.
Types of parameters 'value' and 'value' are incompatible.
Type 'FieldInputs[F]' is not assignable to type 'string'.
Type 'string | number' is not assignable to type 'string'.
Type 'number' is not assignable to type 'string'.
我错过了什么?
【问题讨论】:
-
游乐场没有错误
-
@Niladri 你需要启用
--strictFunctionTypes- 链接中似乎没有共享游乐场选项。 -
这是因为它不允许双变量分配,您将联合类型 "string"|number 分配给
fieldParsers[field],它仅属于字符串类型。在这种情况下,您只能将基本/超类型分配给派生类型。即不允许使用number = string -
@Niladri 我没有给
fieldParsers[field]分配任何东西。我正在阅读它的价值。
标签: typescript