Javascript TypeScript指定单个函数使用的类型

Javascript TypeScript指定单个函数使用的类型,javascript,typescript,types,Javascript,Typescript,Types,我有一个函数返回多个类型联合类型,但后来我有另一个函数,它使用从第一个函数返回的值,但只接受一个类型。现在typescript给了我一个错误,说存在类型不匹配,因为第一个函数可能返回第二个函数不可接受的内容,但我调用它的方式知道它不会有冲突。如何通知typescript第一个方法的返回值将在第二个方法中工作 例如: function returnNumberOrString (variable): string | number { if (variable === 'hello') r

我有一个函数返回多个类型联合类型,但后来我有另一个函数,它使用从第一个函数返回的值,但只接受一个类型。现在typescript给了我一个错误,说存在类型不匹配,因为第一个函数可能返回第二个函数不可接受的内容,但我调用它的方式知道它不会有冲突。如何通知typescript第一个方法的返回值将在第二个方法中工作

例如:

function returnNumberOrString (variable): string | number {
    if (variable === 'hello') return 'hello to you';
    if (variable === 123) return 456;
}

function onlyNumbers (number : number) {
    return number + 1;
}

let number = returnNumberOrString(123);

onlyNumbers(number); // This shows a warning because returnNumberOrString could possibly return a string
这对我很有用:

let n = returnNumberOrString(123);

onlyNumbers(<number>n);

正如James所指出的,这会隐藏编译器错误,但不会阻止传入错误的值,因此您需要非常自信,您可以通过其他方式保证传入的内容

接受的解决方案仅隐藏编译器错误。即使使用类型断言告诉编译器它是一个数字,您仍然可以使用字符串调用onlyNumbers。如果您执行我在下面写的检查,那么除了一个数字之外,您永远不会向onlyNumbers函数传递任何东西。这是一个更安全的操作,如果您正在做任何严格要求数字的事情,正如您的函数名所暗示的那样

function returnNumberOrString (variable): string | number {
    if (variable === 'hello') return 'hello to you';
    if (variable === 123) return 456;
}

function onlyNumbers (number : number) {
    return number + 1;
}

// Can pass string or number, will only ever get a number in val
let val = typeof returnNumberOrString(123) === "number" ? 456 : -1; // I used -1, you can use any value to mean "error" though.

console.log(val); // 456
console.log(onlyNumbers(val)); // 457

let val2 = typeof returnNumberOrString("hello") === "number" ? 456 : -1; 

console.log(val2); // -1
console.log(onlyNumbers(val2)); // 0 

这会隐藏编译器错误,但您仍然可以使用字符串值仅调用ynumbers。e、 g.让val=returnnumber或stringhello;onlyNumbersval;//向…打招呼you1@James是的,他要求的演员阵容基本上是不安全的。问题是,我知道这是安全的;编译器不能或不会推断它是安全的;如何隐藏编译器错误?他可能错了,因为它是安全的;我不能说。在我的特殊情况下,它是安全的,但我知道如果我不确定返回的变量,那么进行类型检查是更好的解决方案。