Tot*_*eRo 5 types function typescript
我有这个界面:
interface IParameters {
form: number;
field: string;
...
}
Run Code Online (Sandbox Code Playgroud)
我希望form属性为数字或函数,并field为字符串或函数。
我尝试这样的事情:
interface IParameters {
form: number | Function;
field: string | Function;
...
}
Run Code Online (Sandbox Code Playgroud)
我需要这个,因为在我的代码中,我像这样使用变量:
var form = (typeof _oParameters.form === "function" ? _oParameters.form() : _oParameters.form);
var field = (typeof _oParameters.field === "function" ? _oParameters.field() : _oParameters.field);
Run Code Online (Sandbox Code Playgroud)
我不想在我的所有代码中将此变量从字符串/数字更改为默认函数,并防止将此变量设置为其他类型。
但是如果我尝试调用这两个变量之一,例如:
var param:IParameters;
param.form();
...
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
无法调用类型缺少调用签名的表达式。
但是param.form = 12;有效。
我发现的唯一的解决办法是声明form和field对any类型。
是否有其他方法来定义没有any类型的变量?
小智 8
如果您尝试使用seriesOne中的代码,则会注意到,您不能分配form(或field)不是函数的值。你会得到一个
Type '{ form: string; }' is not assignable to type 'IParameters'.
Types of property 'form' are incompatible.
Type 'string' is not assignable to type '() => string'.
我发现使用form: (() => string) | string;可以解决此问题。
您可以在打字稿游乐场尝试代码。
工作样本:
interface IParameters {
form: (() => string) | string;
}
function strFunct(): string {
return 'Hello TypeScript';
}
function test() {
let paramA: IParameters = {
form: strFunct
}
let paramB: IParameters = {
form: 'Hello stackoverflow'
}
}
class Foo {
constructor(param: IParameters) {
var x = typeof param.form === 'string' ? param.form : param.form();
}
}
Run Code Online (Sandbox Code Playgroud)
也许如果您使用调用签名而不是 定义联合类型Function,就像这样......
interface IParameters {
// form is of type function that returns number, or number literal.
form: () => number | number;
// field is of type function that returns a string, or string literal.
field: () => string | string;
}
class Foo {
constructor (param: IParameters) {
var x = typeof param.form === "number" ? param.form : param.form();
var y = typeof param.field === "string" ? param.field : param.field();
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,我仍在检查form和field使用typeof,但是 TypeScript 很高兴它可以是函数调用或值。
| 归档时间: |
|
| 查看次数: |
3800 次 |
| 最近记录: |