Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 类型为'的参数;字符串|未定义';不可分配给类型为'&引用;无标题空|未定义';_Typescript_Type Inference - Fatal编程技术网

Typescript 类型为'的参数;字符串|未定义';不可分配给类型为'&引用;无标题空|未定义';

Typescript 类型为'的参数;字符串|未定义';不可分配给类型为'&引用;无标题空|未定义';,typescript,type-inference,Typescript,Type Inference,我不能理解TypeScript的类型推断。我认为这应该是有效的,不需要我指定t的类型: export const deflt = <T>(val: (T | undefined | null), defaultVal: T): T => { if (val === undefined || val === null) { return defaultVal; } return val; } function maybeLabelName(name: str

我不能理解TypeScript的类型推断。我认为这应该是有效的,不需要我指定
t
的类型:

export const deflt = <T>(val: (T | undefined | null), defaultVal: T): T => {
  if (val === undefined || val === null) {
    return defaultVal;
  }
  return val;
}

function maybeLabelName(name: string | undefined) {
  return deflt(name, 'untitled');
}
我可以通过将
deflt
调用更改为以下选项之一来修复它:

// Option 1:
return deflt<string>(name, 'untitled');

// Option 2:
const s: string = 'untitled';
return deflt(name, s);
//选项1:
返回deflt(名称“untitled”);
//备选案文2:
常量s:string='untitled';
返回deflt(名称,s);

TypeScript不应该自动推断
字符串
类型吗?

我认为在这种情况下,TypeScript推断
t
的方式有点奇怪。由于您指定常量
'untitled'
,编译器将推断
T
为字符串文字类型
'untitled'
,因为这是推断
T
的最简单的站点。然后,它将对照字符串文本类型检查另一个参数,并发现
string
不可分配给
“untitled”
。解决方法是在推断
T
时,通过添加与
{}
的额外交点来降低第二个参数的优先级:

export const deflt = <T>(val: (T | undefined | null), defaultVal: T & {} ): T => {
    if (val === undefined || val === null) {
        return defaultVal;
    }
    return val;
}

function maybeLabelName(name: string | undefined) {
    return deflt(name, 'untitled'); // T is string now
}

使用泛型时,可以有两种不同的方法“泛化”参数

以您的案例为例:

const deflt=(val:(T | undefined | null),defaultVal:T):T

如果您使用:
deflt(a,b)
,那么您将强制
a
string |未定义| null
b
string

如果使用:
deflt(a:string,b:untitled”)
,则传输程序将
“untitled”
理解为常量,而不是字符串。因此,
b
将属于
类型“无标题”
,从而使
T
属于
类型“无标题”
。当您使用类型为
string
a
时,编译器无法将
string
强制转换为
“untitled”


解决方案已由

提供。您已将deflt声明为通用函数,但已将其用作常规函数

const deflt = <T>(val: (T | undefined | null), defaultVal: T): T => {
    if (val === undefined || val === null) {
      return defaultVal;
    }
    return val;
}

function maybeLabelName(name?: string) {
    return deflt<typeof name>(name, 'untitled');
}
const deflt=(val:(T | undefined | null),defaultVal:T):T=>{
如果(val==未定义| | val==空){
返回defaultVal;
}
返回val;
}
函数名称(名称?:字符串){
返回deflt(名称“untitled”);
}

你使用什么版本的TypeScript?@finico你可以在最新的TS中复制,你只需要
StrictNullckeks
就可以了。我使用的是TypeScript 3.1.6。这感觉就像一个bug。@Nurpax你可以将它发布到GitHub。。但这也推断出字符串文本类型
export const deflt=(val:T):T=>{return val;}deflt('untitled');/T是“无标题的”
不可否认,这确实让我觉得是违反直觉和相当奇怪的行为。你认为这是值得一提的,还是仅仅是“按设计工作”?编辑:太慢:)我认为TypeScript不需要我为泛型函数指定类型参数。类型推断应该处理这个问题。请参阅例如,“注意,我们不必显式地在尖括号()中传递类型;编译器只需查看值“myString”,并将t设置为其类型。”是的,这是一个非常好的错误,在针对TypeScript提交错误时发现了两个类似的错误,并决定不提交新的错误。谢谢你的链接!
function maybeLabelName(name: string | undefined) {
    return deflt(name, 'untitled' as string); // T is string now
}
const deflt = <T>(val: (T | undefined | null), defaultVal: T): T => {
    if (val === undefined || val === null) {
      return defaultVal;
    }
    return val;
}

function maybeLabelName(name?: string) {
    return deflt<typeof name>(name, 'untitled');
}