函数返回类型是字符串而不是字符串常量

时间:2017-09-21 11:55:11

标签: typescript

此代码:

interface ISomething {
 x: "a"|"b"; 
}


function f() {
  return {
    x: "a",
  };
}

function y(s: ISomething) {

}

const obj = f();
const obj2 = {
  x: "a",
};

const obj3 = "a";

y(obj); // Doesnt work
y(obj2); // Doesnt work
y({x: obj3}); // Works

不编译,显示此错误:

  

类型'{x:string; }'不能分配给'ISomething'类型的参数。     属性“x”的类型不兼容。       类型'string'不能分配给''a“|类型“B”

因为typeof f是这样的:

f() => {x: string}

为什么f会返回{x: string}而不是{x: "a"}?此代码应完全有效。

2 个答案:

答案 0 :(得分:1)

正如您所写,编译器将从f()返回的类型推断为{ x: string; },但您可以告诉它更具体,如下所示:

function f(): ISomething {
    return {
        x: "a",
    };
}

修改

编译器会推断出这个:

const a = "a"; // type of a is "a"

因为它是const,以后无法更改为其他值,但例如:

let a = "a"; // type of a is now string

因为您以后可以执行以下操作:

a = "b";

同样在这里:

const obj2 = {
    x: "a",
};

即使obj2const,您也可以更改属性:

obj2.x = "b";

这就是编译器推断obj2.x属于string类型的原因。

您需要更明确地帮助编译器理解您想要的内容。编译器并不总是按我们的意愿推断类型。

答案 1 :(得分:0)

因为,在f函数中,"a"是字符串值,而不是类型。

如果您希望它成为某种类型,请将其强制转换为"a"

function f() {
  return {
    x: "a" as "a",
  };
}