在Java中我会声明一个这样的函数:
public boolean Test(boolean test) throws Exception {
if (test == true)
return false;
throw new Exception();
}
我可以使用此功能而无需处理异常。
如果有可能,如何在打字稿中做同样的事情?编译器会告诉我,如果没有try / catch,我就无法使用该函数。
答案 0 :(得分:7)
你至少可以用 @throws
jsdoc 标记函数。即使它没有在 typescript 编译器中提供静态分析错误,如果你试图忽略抛出的函数,一些好的 IDE 或 linter 可能仍然 report a warning
/**
* @throws {Error}
*/
function someFunc() {
if (Math.random() < 0.5) throw Error();
}
someFunc();
答案 1 :(得分:5)
TypeScript中没有此类功能。仅当函数返回错误而不抛出错误时才可以指定错误类型(这很少发生并且很容易出现反模式)。
唯一相关的类型是never
。它仅适用于函数肯定会抛出错误的情况,它不能更具体。它是一种类型,它不会导致类型错误,只要它不会导致类型问题:
function Test(): never => {
throw new Error();
}
Test(); // won't cause type error
let test: boolean = Test(); // will cause type error
当函数有可能返回值时,never
被返回类型吸收。
可以在函数签名中指定它,但仅供参考:
function Test(test: boolean): boolean | never {
if (test === true)
return false;
throw new Error();
}
它可以向开发人员提示可能存在未处理的错误(如果函数正文中不清楚),但这不会影响类型检查,也不能强制try..catch
;通过键入system,此函数的类型被视为(test: boolean) => boolean
。
答案 2 :(得分:2)
在Typescript / Javascript中,我们有Error
类来使用消息而不是Exception
类抛出自定义异常。因此,您的代码应如下所示 -
public Test(test:boolean):boolean {
if (test == true)
return false;
throw new Error("Custom error");
}
这是完整的代码 -
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
public Test(test:boolean):boolean {
if (test == true)
return false;
throw new Error("Custom error");
}
}
let greet = new Greeter("Hi");
console.log("output : " + greet.Test(true)); // output :false
console.log("Error : " + greet.Test(false)); //Error: Custom error
答案 3 :(得分:0)
目前无法执行。您可以签出此请求的功能: https://github.com/microsoft/TypeScript/issues/23060
答案 4 :(得分:0)
您不能使用纯ts(v <3.9),我希望将来可以使用。 但是,可能的解决方法是,将可能的引发类型隐藏在方法的签名中,然后在catch块中恢复这些类型。 我使用以下解决方法制作了一个软件包:https://www.npmjs.com/package/ts-throwable/v/latest
使用情况大致如下:
import { throwable, getTypedError } from 'ts-throwable';
class CustomError extends Error { /*...*/ }
function brokenMethod(): number & throwable<CustomError> {
if (Math.random() < 0.5) { return 42 };
throw new CustomError("Boom!");
}
try {
const answer: number = brokenMethod()
}
catch(error){
// `typedError` is now an alias of `error` and typed as `CustomError`
const typedError = getTypedError(error, brokenMethod);
}
答案 5 :(得分:0)
您可以将JavaScript的Error
视为Java的RuntimeException
(未经检查的异常)。
您可以扩展JavaScript的Error
,但可以扩展you have to use Object.setPrototypeOf
来恢复原型链,因为Error
会破坏它。 this answer中也解释了setPrototypeOf的需要。
export class AppError extends Error {
code: string;
constructor(message?: string, code?: string) {
super(message); // 'Error' breaks prototype chain here
Object.setPrototypeOf(this, new.target.prototype); // restore prototype chain
this.name = 'AppError';
this.code = code;
}
}
答案 6 :(得分:0)
不是 TypeScript,但 Hegel 可能会引起人们的兴趣,它是 JavaScript 的另一个类型检查器,具有此功能。你会写:
function Test(test: boolean): boolean | $Throws<Exception> {
if (test)
return false;
throw new Exception();
}