【问题标题】:could be instantiated with an arbitrary type which could be unrelated to 'string'可以用与“字符串”无关的任意类型实例化
【发布时间】:2020-06-18 08:18:57
【问题描述】:

我有以下功能

function pickAndTrim <T> (keys : Array<string>, object : T ) : T {
    function trim <A> (input : A) : A {
            if (typeof input === "string") {
                return input.trim();
            }
            return input;
    }
    let updates = R.pick(keys, object);
    updates = R.map(trim, updates);
    return updates;
}

注意: R 是 Ramda

它所做的是它获取一个对象,从中选择某些键(和值),然后从结果对象中修剪任何值(如果它是一个字符串)。

我得到的当前错误是:

Type 'string' is not assignable to type 'A'.
  'A' could be instantiated with an arbitrary type which could be unrelated to 'string'.

我如何让 typescript 接受它肯定是一个字符串(因为我用 typeof 检查了它)

【问题讨论】:

    标签: typescript


    【解决方案1】:

    TypeScript 不会抱怨“输入”不是字符串-“'字符串'不可分配给类型 'A'”-我认为问题是,在某些情况下,TypeScript 会推断出函数类型 f: A -&gt; string 然后你有一些let var: A = f(x),但你不能将字符串分配给 A。

    我不熟悉 Rambda,但您可以尝试使用带有类型保护的过滤器:

    filter updates (x =&gt; typeof x === 'string')

    所以你有一个字符串列表,然后映射到它。

    或者显然 Ramda 有一个pickBy 函数:

    R.pickBy((val, key) => (keys.indexOf(key) >= 0) && (typeof val === 'string'), object);
    

    我不熟悉那个库,而且我似乎无法获取这些函数的类型信息,所以它返回“any”,这不太好。

    【讨论】:

    • 应该有一个@types/ramda,但我只是通过删除输入来消除错误。 Typescript 对我来说仍然是 /shrug,但至少它解决了我现在需要的东西。 Ramda 在 Exclude&lt;T, &lt;string... 的东西上遇到了一些问题,这对我来说太混乱了
    • TypeScript手册真不错,经常帮到我:typescriptlang.org/docs/handbook/basic-types.html
    猜你喜欢
    • 2021-01-19
    • 2020-11-28
    • 1970-01-01
    • 2021-05-11
    • 2021-10-26
    • 2021-10-08
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多