<p dir="auto">is there a better way to express this, without explicitly listing out every member of the interface?</p>
<div class="highlight highlight-source-ts notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="interface Foo {
    a: string
}

// ok
class Bar implements Foo {
    constructor (public a: string) {}
}

// Error: Class 'Baz' incorrectly implements interface 'Foo'.
//        Property 'a' is missing in type 'Baz'
class Baz implements Foo {
    constructor (a: Foo) {
        Object.assign(this, a)
    }
}"><pre class="notranslate"><span class="pl-k">interface</span> <span class="pl-smi">Foo</span> <span class="pl-kos">{</span>
    <span class="pl-c1">a</span>: <span class="pl-smi">string</span>
<span class="pl-kos">}</span>

<span class="pl-c">// ok</span>
<span class="pl-k">class</span> <span class="pl-smi">Bar</span> <span class="pl-k">implements</span> <span class="pl-smi">Foo</span> <span class="pl-kos">{</span>
    <span class="pl-en">constructor</span> <span class="pl-kos">(</span><span class="pl-k">public</span> <span class="pl-s1">a</span>: <span class="pl-smi">string</span><span class="pl-kos">)</span> <span class="pl-kos">{</span><span class="pl-kos">}</span>
<span class="pl-kos">}</span>

<span class="pl-c">// Error: Class 'Baz' incorrectly implements interface 'Foo'.</span>
<span class="pl-c">//        Property 'a' is missing in type 'Baz'</span>
<span class="pl-k">class</span> <span class="pl-smi">Baz</span> <span class="pl-k">implements</span> <span class="pl-smi">Foo</span> <span class="pl-kos">{</span>
    <span class="pl-en">constructor</span> <span class="pl-kos">(</span><span class="pl-s1">a</span>: <span class="pl-smi">Foo</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
        <span class="pl-smi">Object</span><span class="pl-kos">.</span><span class="pl-en">assign</span><span class="pl-kos">(</span><span class="pl-smi">this</span><span class="pl-kos">,</span> <span class="pl-s1">a</span><span class="pl-kos">)</span>
    <span class="pl-kos">}</span>
<span class="pl-kos">}</span></pre></div>
<p dir="auto">demo: <a href="http://www.typescriptlang.org/Playground#src=interface%20Foo%20%7B%0A%09a%3A%20string%0A%7D%0A%0A%2F%2F%20ok%0Aclass%20Bar%20implements%20Foo%20%7B%0A%09constructor%20(public%20a%3A%20string)%20%7B%7D%0A%7D%0A%0A%2F%2F%20Error%3A%20Class%20'Baz'%20incorrectly%20implements%20interface%20'Foo'.%0A%2F%2F%20%20%20%20%20%20%20%20Property%20'a'%20is%20missing%20in%20type%20'Baz'%0Aclass%20Baz%20implements%20Foo%20%7B%0A%09constructor%20(a%3A%20Foo)%20%7B%0A%09%09Object.assign(this%2C%20a)%0A%09%7D%0A%7D" rel="nofollow">http://www.typescriptlang.org/Playground#src=interface%20Foo%20%7B%0A%09a%3A%20string%0A%7D%0A%0A%2F%2F%20ok%0Aclass%20Bar%20implements%20Foo%20%7B%0A%09constructor%20(public%20a%3A%20string)%20%7B%7D%0A%7D%0A%0A%2F%2F%20Error%3A%20Class%20'Baz'%20incorrectly%20implements%20interface%20'Foo'.%0A%2F%2F%20%20%20%20%20%20%20%20Property%20'a'%20is%20missing%20in%20type%20'Baz'%0Aclass%20Baz%20implements%20Foo%20%7B%0A%09constructor%20(a%3A%20Foo)%20%7B%0A%09%09Object.assign(this%2C%20a)%0A%09%7D%0A%7D</a></p>
<p dir="auto"><strong>TypeScript Version:</strong></p>
<p dir="auto">1.8.9</p>
<p dir="auto"><strong>Code</strong></p>
<div class="highlight highlight-source-ts notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="interface CanDevelop {
    developSomethingAmazing();
}
class Person {
    age: number;
    name: string;
}

class Developer extends Person implements CanDevelop {  
    developSomethingAmazing() {}
}

function canDevelop(arg: any): arg is CanDevelop {
    return arg.developSomethingAmazing !== undefined;
}

let john: Object = new Developer();

if (canDevelop(john)) {
    john.developSomethingAmazing();  // OK
}

let peter: Person = new Developer();

if (canDevelop(peter)) {
    peter.developSomethingAmazing(); // ERROR
}
"><pre class="notranslate"><span class="pl-k">interface</span> <span class="pl-smi">CanDevelop</span> <span class="pl-kos">{</span>
    <span class="pl-c1">developSomethingAmazing</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-kos">}</span>
<span class="pl-k">class</span> <span class="pl-smi">Person</span> <span class="pl-kos">{</span>
    <span class="pl-c1">age</span>: <span class="pl-smi">number</span><span class="pl-kos">;</span>
    <span class="pl-c1">name</span>: <span class="pl-smi">string</span><span class="pl-kos">;</span>
<span class="pl-kos">}</span>

<span class="pl-k">class</span> <span class="pl-smi">Developer</span> <span class="pl-k">extends</span> <span class="pl-smi">Person</span> <span class="pl-k">implements</span> <span class="pl-smi">CanDevelop</span> <span class="pl-kos">{</span>  
    <span class="pl-en">developSomethingAmazing</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">{</span><span class="pl-kos">}</span>
<span class="pl-kos">}</span>

<span class="pl-k">function</span> <span class="pl-en">canDevelop</span><span class="pl-kos">(</span><span class="pl-s1">arg</span>: <span class="pl-smi">any</span><span class="pl-kos">)</span>: <span class="pl-s1">arg</span> is <span class="pl-smi">CanDevelop</span> <span class="pl-kos">{</span>
    <span class="pl-k">return</span> <span class="pl-s1">arg</span><span class="pl-kos">.</span><span class="pl-c1">developSomethingAmazing</span> <span class="pl-c1">!==</span> <span class="pl-c1">undefined</span><span class="pl-kos">;</span>
<span class="pl-kos">}</span>

<span class="pl-k">let</span> <span class="pl-s1">john</span>: <span class="pl-smi">Object</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-smi">Developer</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span>

<span class="pl-k">if</span> <span class="pl-kos">(</span><span class="pl-en">canDevelop</span><span class="pl-kos">(</span><span class="pl-s1">john</span><span class="pl-kos">)</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
    <span class="pl-s1">john</span><span class="pl-kos">.</span><span class="pl-en">developSomethingAmazing</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span>  <span class="pl-c">// OK</span>
<span class="pl-kos">}</span>

<span class="pl-k">let</span> <span class="pl-s1">peter</span>: <span class="pl-smi">Person</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-smi">Developer</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span>

<span class="pl-k">if</span> <span class="pl-kos">(</span><span class="pl-en">canDevelop</span><span class="pl-kos">(</span><span class="pl-s1">peter</span><span class="pl-kos">)</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
    <span class="pl-s1">peter</span><span class="pl-kos">.</span><span class="pl-en">developSomethingAmazing</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// ERROR</span>
<span class="pl-kos">}</span></pre></div>
<p dir="auto"><strong>Expected behaviour:</strong><br>
It should allow to use the CanDevelop interface methods.</p>
<p dir="auto"><strong>Actual behaviour:</strong><br>
Error "Property 'developSomethingAmazing' does not exist on type 'Person'".</p>