定义TypeScript变量类型函数或字符串

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;有效。

我发现的唯一的解决办法是声明formfieldany类型。

是否有其他方法来定义没有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)

  • 哇!`IParameters` 函数之间的括号就成功了! (2认同)

ser*_*0ne 7

也许如果您使用调用签名而不是 定义联合类型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)

在这里,我仍在检查formfield使用typeof,但是 TypeScript 很高兴它可以是函数调用或值。