是否有一个TypeScript`partial <any>`类型的函数参数接受`any`但是`void`?

时间:2017-09-01 22:04:39

标签: typescript types

对于界面,可以使用Partial<X>Mapped Type来说明&#34;允许X的所有属性,但不要期望它们#34;。

以下导致编译器错误:

interface X { foo: boolean }

function doSomething(x: Partial<X>) {
  let aBoolean: boolean = x.foo; // ERROR: possibly undefined
}

doSomething({ foo: true }); // OK
doSomething({}); // OK
doSomething(true); // ERROR: Type 'boolean' has no properties in common with 'Partial<X>'

我想用any做同样的事情来说&#34;这个函数可以接受任何参数作为参数,但是你不能指望任何东西在那里&#34;

function doSomething(x: Partial<any>) {
  let aBoolean: boolean = x.foo; // OK, but I wish it wasn't
}

doSomething({ foo: true }); // OK
doSomething({}); // OK
doSomething(true); // OK
doSomething(/* etc. */); // OK

我希望我的函数接受任何东西和所有东西作为参数,但在函数内部我不能访问对象的任何属性而不先检查它们。如果函数x内部的类型为voidnever,则表示即可。

我并不感到惊讶Partial<any>没有像我希望的那样工作 - 我绝对要求&#34;为什么没有{{1}以我希望的方式工作&#34;。我问:

我可以将哪种类型用于参数Partial<any>,以便:

  1. 它接受任何/每种类型的参数
  2. 在函数内部,x的类型是每个属性可能未定义的(或x类型为x等)。

1 个答案:

答案 0 :(得分:1)

  

我可以使用哪种类型的参数x:

1. it accepts arguments of any/every type
2. inside the function the type of x is something where every property 
   is possibly undefined (or x is of type void, etc.)

它是空对象类型{},几乎与任何类型都兼容,并允许您将几乎任何内容传递给doSomething

function doSomething(x?: {})  {...}

doSomething({ foo: true }); // OK
doSomething({}); // OK
doSomething(true); // OK
doSomething(/* etc. */); // OK

但是在实现中对它一无所知,如果不先检查就不能使用它:

function doSomething(x?: {})  {
    //let b: boolean = x; // error
    //let o: {} = x; // error when strictNullChecks in on
    //let bar: string = x.foo;  // error

    if (typeof x === 'boolean') {
        let b: boolean = x;
    }
    if (x !== undefined) {
        if (hasProperty(ofTypeString, x, 'foo')) {
            let bar: string = x.foo;
        }
    }
};

function hasProperty<T, N extends string>(
    guard: (p: any) => p is T, 
    x: {}, 
    name: N
): x is {[n in N]: T} 
{
    return (name in x) && guard((x as any)[name]);
}


function ofTypeString(p: any): p is string {
    return typeof p === 'string'
}